在Python程序中手动引发异常会终止程序吗?

1 投票
2 回答
2017 浏览
提问于 2025-04-18 05:33

在Python中,使用raise语句会导致程序抛出一个异常,这通常会让程序停止运行,并显示错误信息(也就是所谓的回溯)。不过,有时候你可能希望抛出异常后,程序还能继续执行后面的代码。比如,你在一个第三方系统中运行程序,希望能抛出异常,但又想让程序继续运行下去。你提到的代码是一个多线程的函数,它需要返回结果。那有没有办法单独开一个新线程来抛出异常,然后让主程序继续运行呢?

2 个回答

1

只有那些没有被处理的错误(也叫“未捕获异常”)才会导致程序停止。如果你抛出一个错误,而你的第三方软件没有准备好去处理这个错误,程序就会结束。抛出一个错误就像是轻轻地中止程序:你不知道怎么处理这个错误,但你给使用你代码的人一个机会去处理,而不是直接调用 sys.exit() 来结束程序。

如果你不想让程序退出,就不要抛出错误。可以选择记录这个错误。

2

我想抛出一个异常,但希望程序能继续运行。

这样做其实没什么意义:程序要么继续执行代码,要么会向上回溯到最近的 try 块。

你可以尝试以下几种方法:

  • 使用 traceback 模块(这个模块可以帮助你查看或检查异常时的追踪信息;你可以很方便地把它获取为文本)
  • 使用 logging 模块(这个模块可以在程序运行时保存诊断信息)

示例:

def somewhere():
    print 'Oh no! Where am I?'
    import traceback
    print ''.join(traceback.format_stack())  # or traceback.print_stack(sys.stdout)
    print 'Oh, here I am.'

def someplace():
    somewhere()

someplace()

输出:

Oh no! Where am I?
  File "/home/kos/exc.py", line 10, in <module>
    someplace()
  File "/home/kos/exc.py", line 8, in someplace
    somewhere()
  File "/home/kos/exc.py", line 4, in somewhere
    print ''.join(traceback.format_stack())

Oh, here I am.

撰写回答