diff --git "a/\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-python\350\257\255\350\250\200\351\200\232\347\224\250\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-python\350\257\255\350\250\200\351\200\232\347\224\250\347\274\226\347\250\213\350\247\204\350\214\203.md" index 798c6fc30acc4769aab14a9f8f324abf3d561e27..f89ea632f0dba07642a3877659e7a510956eedc6 100644 --- "a/\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-python\350\257\255\350\250\200\351\200\232\347\224\250\347\274\226\347\250\213\350\247\204\350\214\203.md" +++ "b/\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-python\350\257\255\350\250\200\351\200\232\347\224\250\347\274\226\347\250\213\350\247\204\350\214\203.md" @@ -313,6 +313,58 @@ except语句的表达式只能是派生自BaseException的类,或者由这些 except (ValueError, TypeError) as exception: print("Catching all exceptions") +## 规则2.6 异常对象的__cause__字段应该是一个异常类或者None(python:S5707) +异常链让开发人员可以查看一个异常是否由另一个异常触发。异常对象可以使用下面的语法串联起来: +raise NewException() from chained_exception +new_exception.__cause__ = chained_exception +同样可以使用new_exception.__cause__ = None或者except ... from None这样的语句中断一个异常链。 +如果这样的语法串联的不是一个异常类对象,那么异常链会失败或者引发一个异常。 + +### 错误代码 + class A: + pass + + try: + raise ValueError("orig") + except ValueError as e: + new_exc = TypeError("new") + new_exc.__cause__ = A() # Noncompliant + raise new_exc + + try: + raise ValueError("orig") + except ValueError as e: + raise TypeError("new") from "test" # Noncompliant + +### 正确代码 + try: + raise ValueError("orig") + except ValueError as e: + new_exc = TypeError("new") + new_exc.__cause__ = None # Ok + raise new_exc + + try: + raise ValueError("orig") + except ValueError as e: + new_exc = TypeError("new") + new_exc.__cause__ = e # Ok + raise new_exc + + try: + raise ValueError("orig") + except ValueError as e: + raise TypeError("new") from None # Ok + + try: + raise ValueError("orig") + except ValueError as e: + raise TypeError("new") from e # Ok + +### 参考资料 +[pep-3134](https://peps.python.org/pep-3134/) + +[pep-0409](https://peps.python.org/pep-0409/) # 3 参数与返回值 ## 规则3.1 __init__函数不应该有显示返回值(python:S2734)