我有一些处理异常的代码,我想只在特定异常的情况下做一些特定的事情,并且只在调试模式下。例如:
try:
stuff()
except Exception as e:
if _debug and e is KeyboardInterrupt:
sys.exit()
logging.exception("Normal handling")
因此,我不想只添加一个:
except KeyboardInterrupt:
sys.exit()
因为我试图在这个调试代码中保持差异
答案 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()