Python速记异常处理

Python速记异常处理,python,python-2.7,exception,Python,Python 2.7,Exception,我在Python中处理异常时遇到了一个特定的问题。在很多情况下,有一个代码区域我希望忽略所有异常。假设我有100行代码,我希望这样做 这就是大多数人认为的解决方案: try: line 1 line 2 line 3 ... line 99 line 100 except: pass 这在我的情况下(和许多其他情况下)实际上不起作用。假设第3行有一个异常。一旦抛出异常,它将直接转到“pass”,并跳过第4-100行。我能想到的唯一解决方案

我在Python中处理异常时遇到了一个特定的问题。在很多情况下,有一个代码区域我希望忽略所有异常。假设我有100行代码,我希望这样做

这就是大多数人认为的解决方案:

try:
    line 1
    line 2
    line 3
    ...
    line 99
    line 100
except:
    pass
这在我的情况下(和许多其他情况下)实际上不起作用。假设第3行有一个异常。一旦抛出异常,它将直接转到“pass”,并跳过第4-100行。我能想到的唯一解决方案是:

try:
    line 1
except:
    pass

try:
    line 2
except:
    pass

try:
    line 3
except:
    pass

...

try:
    line 99
except:
    pass

try:
    line 100
except:
    pass

但是,很明显,这是非常丑陋的,草率的,而且需要绝对的时间。如何以更短、更简洁的方式编写上述代码?如果您给出了一个允许用其他代码替换“pass”的方法,则会获得额外的积分

您可以尝试将代码分成更小的块,这样它就可以正确地处理错误,而不需要放弃所有进度并循环返回

除此之外,还可以使用另一种解决方案,即进行检查,如果为代码设置标志以检查其是否可以继续,或者是否需要重复最后一步,则可以防止额外的迭代

例如:

while not continue:
    try:
        a = input('Enter data')
    except:
        pass
    if a != null:
        continue = true

正如其他答案已经说明的,你应该考虑重构你的代码。< /P> 这就是说,我忍不住要把一些东西拼凑在一起,以便在发生异常时能够执行您的函数而不会出现故障

import ast, _ast, compiler

def fail():
    print "Hello, World!"
    raise Exception
    x = [4, 5]
    print x

if __name__ == '__main__':
    with open(__file__, 'r') as source:
        tree = ast.parse(source.read(), __file__)
        for node in ast.iter_child_nodes(tree):
            if isinstance(node, _ast.FunctionDef):
                _locals = {}
                for line in node.body:
                    mod = ast.Module()
                    mod.body = [line]
                    try:
                        exec(compile(mod, filename='<ast>', mode='exec'), _locals, globals())
                    except:
                        import traceback
                        traceback.print_exc()
导入ast,\u ast,编译器
def fail():
打印“你好,世界!”
引发异常
x=[4,5]
打印x
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
以open(_文件__,'r')作为源:
tree=ast.parse(source.read(),_文件_)
对于ast.iter\u子节点(树)中的节点:
如果isinstance(节点,_ast.FunctionDef):
_局部变量={}
对于node.body中的行:
mod=ast.Module()
mod.body=[行]
尝试:
exec(编译(mod,filename='',mode='exec'),_locals,globals())
除:
导入回溯
traceback.print_exc()
代码执行它在全局范围内找到的任何函数,并防止它在失败时退出。它通过迭代文件的AST来实现,并为函数的每一行创建一个新模块来执行

如您所料,程序的输出为:

Hello, World!
Traceback (most recent call last):
  File "kek.py", line 18, in <module>
    exec(compile(m, filename='<ast>', mode='exec'), _locals, globals())
  File "<ast>", line 3, in <module>
Exception
[4, 5]
你好,世界!
回溯(最近一次呼叫最后一次):
文件“kek.py”,第18行,在
exec(compile(m,filename='',mode='exec'),_locals,globals())
文件“”,第3行,在
例外情况
[4, 5]
我应该强调,在任何生产代码中使用它都是一个坏主意。但为了论证起见,类似的方法是可行的。你甚至可以用一个漂亮的装饰器来包装它,尽管这不会改变这是一个坏主意的事实


重构快乐

听起来您需要对代码进行一些认真的重新设计。你真的有100行完全独立的代码,它们彼此完全不依赖,不能放在一个循环中,所有这些代码都可能以你的代码可以恢复的方式失败吗?如果你在做测试,你真的应该进行增量测试。。。例如。。。。如果工作流是a->b->c,要做c,需要先做a->b。。。。所以,如果a或b失败,就没有理由测试c。我实际上没有100行,但有时有6行或7行。是的,在好的代码中,您应该只捕获您以某种方式期望的异常,这意味着您应该确定指定要捕获的异常。如果捕获异常的方式使您的坏代码正常工作,那将是一个非常非常糟糕的想法。捕获一些东西,例如,将字符串转换为整数,但字符串无法转换,因为它不表示数字。但是,这些真的完全独立吗?如中所示,如果其中任何一个失败,您的程序完全正常?你能不能把它们放在一个循环中?虽然这不是我想要的答案,但它仍然回答了我的问题。我可能会坚持老方法(实际上只是几行代码,而不是100行),因为这是生产代码。我的整个代码并不是像这样草率,但有些地方的事情变得超级复杂和混乱。