在python中处理特定的异常类型

时间:2010-12-01 21:42:29

标签: python exception exception-handling

我有一些处理异常的代码,我想只在特定异常的情况下做一些特定的事情,并且只在调试模式下。例如:

try:
    stuff()
except Exception as e:
    if _debug and e is KeyboardInterrupt:
        sys.exit()
    logging.exception("Normal handling")

因此,我不想只添加一个:

except KeyboardInterrupt:
    sys.exit()

因为我试图在这个调试代码中保持差异

7 个答案:

答案 0 :(得分:22)

嗯,实际上,您可能应该将KeyboardInterrupt的处理程序分开。为什么你只想在调试模式下处理键盘中断,否则吞下它们呢?

也就是说,您可以使用isinstance来检查对象的类型:

try:
    stuff()
except Exception as e:
    if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logger.exception("Normal handling")

答案 1 :(得分:20)

这就是它的完成方式。

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        sys.exit()
    logging.exception("Normal handling")
except Exception as e:
    logging.exception("Normal handling")

重复次数最少。然而,不是零,而是最小的。

如果“正常处理”不止一行代码,您可以定义一个函数以避免重复两行代码。

答案 2 :(得分:1)

你应该让KeyboardInterrupt一直冒泡并将其捕获到最高级别。

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        sys.exit()
    except:
        pass

def main():
    try:
        stuff()
    except Exception as e:
        logging.exception("Normal handling")
        if _debug:
            raise e

答案 3 :(得分:0)

有什么问题
try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        logging.exception("Debug handling")
        sys.exit()
    else:
        logging.exception("Normal handling")

答案 4 :(得分:0)

使用其他答案中提到的标准方法,或者如果你真的想在except块中进行测试,那么你可以使用isinstance()

try:
    stuff()
except Exception as e:
   if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logging.exception("Normal handling")

答案 5 :(得分:0)

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        sys.exit()
    logging.exception("Normal handling")
except ValueError:
    if _debug:
        sys.exit()
    logging.exception("Value error Normal handling")
else:
    logging.info("One more message without exception")

答案 6 :(得分:0)

您可以在Python中命名特定的例外:

try:
    stuff()
except KeyboardInterrupt:
    sys.exit()
except Exception:
    normal_handling()