Python - 可以强制引发异常而不管try / except块?

时间:2009-04-29 15:06:41

标签: python exception

在Python中是否存在任何语言(或解释器)功能来强制python解释器始终引发异常,即使违规代码异常位于try / except块中也是如此?

我刚刚继承了用python编写的更大更旧的代码库,其目的是与我们开发的一些定制设计的硬件进行通信。 由于以下(简化)代码模式,许多通信错误和超时被掩盖/遗漏:

try:
    serialport.write(MSG)
except:
    some_logging_function_mostly_not_working_that_might_be_here_or_not()
    #or just:
    #pass

为了避免“只是从头开始重写整个事情”的典型场景,我正在尝试修复所有异常错误/超时。我这样做是通过手动禁用所有异常处理代码,一次一个。

4 个答案:

答案 0 :(得分:11)

“所有例外”except:块是一件非常糟糕的事情,除了处理之外,必须简单地找到并替换为合理的。

在这种情况下grep是你的朋友。一个好的IDE可以帮助使这些不愉快的家务变得易于管理。

但是Python中没有“忽略编写的代码”选项。

答案 1 :(得分:3)

不,不是真的。您最好的选择是将代码更改为更像这样的内容:

try:
    serialport.write(MSG)
except:
    some_logging_function_mostly_not_working_that_might_be_here_or_not()
    raise

这将使它重新引发确切的异常。您需要了解的主要事情是,如果有一种方法可以使所有异常退出系统,那么您将无法使用for循环(迭代器会引发StopIteration异常)。

答案 2 :(得分:0)

我猜你想忽略,除非你正在调试,否则应用它。

一个好方法是让一个全局变量说 debug=True 并有条件地调用 raise:

debug=True

def foo:
   try:
       # do some code
   except:
       if debug: raise #put this in all excepts

现在将 debug 设置为 False 每当 raise 被静音时

答案 3 :(得分:-2)

您可以使用多个异常处理程序来处理多个异常。

try:
    serialport.write(MSG)
except Handler1:
    some_logging_function_mostly_not_working_that_might_be_here_or_not()
    #or just:
    #pass
except Handler2:
    some_logging_function_mostly_not_working_that_might_be_here_or_not2()
    #or just:
    #pass