Python 异常

Python 异常

错误:语法不符合Python规则,出现解析错误

异常:语法无误,运行时引发错误。

常见的异常类型

异常 示例
NameError a * 3
IndexError a = [1,2,3]
a[3] = 100
TypeError '2' + 2
ValueError int("a.123")
ZeroDivisionError 1 / 0

异常执行的逻辑

  1. 试图执行的语句块。如果没有异常发生,则跳过except子句
  2. 如果有异常发生,则跳过try子句剩余部分,根据异常类型去匹配except后面的异常。
    • 匹配成功执行except子句的的语句块。
    • 如果异常类型与所有except类型不匹配,则该异常会传递给更外层的try-except语句。
  3. 如果异常无法被任何except子句处理,则程序抛出异常并停止运行。
# 示例
class ScoreError(Exception):
    pass

try:
    if score > 100 or score < 0:  # 正常的程序逻辑,可能会抛出异常
        raise ScoreError("成绩应该在0~100之间")
    print("成绩为{score}")
except ScoreError as e:  # e为当前发生异常的示例对象
    print(repr(e))  # 异常类型+异常详细信息
    print(str(e))
    print(e)
except (TypeError,NameError):  # except后面异常类型可以是多个异常类型的元组
    pass
except:  # except也可以是空,表示捕获所有异常
    pass
else:  # 如果try子句执行没有发生异常事执行else;发生异常则略过else
    pass
finally:
    pass  # 无论try子句是否发生异常,finally子句都会执行。

自定义异常

  1. 如何自定义异常

    • 异常以类的形式创建,从Exception类派生。
    • 自定义类通常很简单,类体可以省略,默认从父类继承;最重要的名称,用以表明发生了什么状况。
    • 命名规范:以Error结尾,与内置异常名保持一致
  2. 自定义异常可以用于跳出多重循环

    • python没有直接从多重循环里直接跳出的手段

    • break只能跳出它所在的循环,并不能退出整个循环。

      class GetOutOfMultiLoop(Exception):
          pass
      
      try:
          for cock in range(1,20):
              for hen in range(1,33):
                  chick=100-cock-hen
                  if chick % 3 == 0 and 5 * cock + 3 * hen + chick // 3 ==100:
                      raise GetOutOfMultiLoop
      except GetOutOfMultiLoop:
          print("cock=",cock,"hen=",hen,"chick=",chick)
      

except子句

注意:不要捕获全部异常,这种方式很容易掩盖真正的编程错误!
​原则:大多数情况下,仅明确捕获自己能够判断的异常,并进行针对性的处理。

else子句

实际应用中放在else子句中的处理,通常是为了避免它们会抛出异常,从而干扰到try except所保护的代码的运行。

finally

实际应用中,finally子句用于释放外部资源(例如文件或网络连接),保证是否成功使用资源都在最后将其关闭。

posted @ 2023-11-06 08:12  某科学的撒把豆子  阅读(31)  评论(0)    收藏  举报