Python中裸except与指定Exception的区别是什么?
Python中
except Exception:与except:的区别 直接说核心差异:
except Exception:仅捕获继承自Exception类的常规代码/业务异常,像KeyError、NameError、TypeError这类日常常见异常都属于这个范畴,但它不会捕获Python的系统级退出异常(比如用户按Ctrl+C触发的KeyboardInterrupt、调用sys.exit()触发的SystemExit)以及GeneratorExit这类特殊异常——因为这些异常的父类是BaseException,而非Exception。except:是无差别的全量捕获,等价于except BaseException:,会把所有BaseException的子类异常一网打尽,包括上面提到的系统级退出异常。
你觉得两者效果相同,是因为平时写代码遇到的大多是Exception子类的异常,这时候两者表现确实一致,但遇到系统级异常时差异就很明显:
比如你写了一个持续运行的脚本,用except:的话,用户按Ctrl+C想终止程序,KeyboardInterrupt会被捕获,程序没法正常退出;但用except Exception:的话,这个异常不会被拦截,程序会正常响应终止信号。
最佳实践
- 除非你明确要拦截所有异常(这种场景非常罕见),否则优先用
except Exception:,避免误吞系统退出信号,导致程序无法正常终止。 - 更推荐的写法是捕获具体的异常类型(比如
except KeyError:),精准处理特定错误,避免意外掩盖其他问题。
内容的提问来源于stack exchange,提问作者Amir.the.explorer
相关产品推荐
相关产品推荐

