1.异常简介
即使语句或表达式在语法上是正确的,但在尝试执行它时也可能导致错误。执行期间检测到的错误称为异常。
实际上我们学习java的时候分为编译期异常和运行期异常,但是python没有编译期异常<可以暂且这么认为>。
因为我们对运行期异常可以捕获并操作所以异常并不是致命的。
try: a=1/0 except Exception as e: print("有错误") pass
上面的代码及时有异常也可以顺利运行。
while True: try: x = int(input("Please enter a number: ")) break except TypeError: print("Oops! That was no valid number. Try again...")
该try
语句的工作原理如下:
- 首先,执行try子句(
try
andexcept
关键字之间的语句)。
- 如果没有异常发生,则将跳过except子句,并且该
try
语句的执行 完成。
- 如果在try子句执行期间发生异常,则该子句的其余部分将被跳过。然后,如果其类型与以
except
关键字命名的异常匹配 ,则执行except子句,然后在try
语句之后继续执行。
- 如果发生与except子句中命名的异常不匹配的异常:如果有外部
try
语句 则将其传递给外部try
语句,否则将其传递给外部语句。如果未找到任何处理程序,则它是未处理的异常,并且执行停止并显示红色消息。
while True: try: x = int(input("Please enter a number: ")) break except TypeError: pass except ValueError as ve: pass except (ImportError,IOError) as (ime,ioe): pass except: pass
- 一条
try
语句可以有一个以上的except子句,以指定不同异常的处理程序,最多将执行一个处理程序 - except子句可以将多个异常命名为带括号的元组
- 处理程序仅处理在相应的try子句中发生的异常,而不处理同一
try
语句的其他处理程序中的异常。 - except子句可以省略名称,以用作通配符。请谨慎使用,因为这样很容易掩盖实际的编程错误!它也可以用于打印错误消息,然后重新引发异常(允许调用者也处理该异常)
2.对异常类的介绍
我们既可以使用python自带异常类,可以自定义异常类。
2.1.python异常类

+-- BaseException (new; broader inheritance for subclasses) +-- Exception +-- GeneratorExit (defined in PEP 342 [1]) +-- StandardError +-- ArithmeticError +-- DivideByZeroError +-- FloatingPointError +-- OverflowError +-- AssertionError +-- AttributeError +-- EnvironmentError +-- IOError +-- EOFError +-- OSError +-- ImportError +-- LookupError +-- IndexError +-- KeyError +-- MemoryError +-- NameError +-- UnboundLocalError +-- NotImplementedError (stricter inheritance) +-- SyntaxError +-- IndentationError +-- TabError +-- TypeError +-- RuntimeError +-- UnicodeError +-- UnicodeDecodeError +-- UnicodeEncodeError +-- UnicodeTranslateError +-- ValueError +-- ReferenceError +-- StopIteration +-- SystemError +-- Warning +-- DeprecationWarning +-- FutureWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning + -- WindowsError +-- KeyboardInterrupt (stricter inheritance) +-- SystemExit (stricter inheritance)
2.2.python自定义类
自定义异常:
class ShortInputException(Exception): '''自定义异常类''' def __init__(self, length, atleast): self.length = length self.atleast = atleast try: s = input('please input:') if len(s) < 3: raise ShortInputException(len(s), 3) except ShortInputException as e: print('输入长度是%s,长度至少是%s' %(e.length, e.atleast)) else: print('nothing...')
如果输入字符长度小于3,那么将会抛出 ShortInputException 异常:
>>> please input:qw 输入长度是2,长度至少是3
自定义异常的继承与执行:
如果except
子句中的类是同一类或其基类,则该子句与异常兼容(但不是相反的方式-列出派生类的except子句与基类不兼容)
class B(Exception): pass class C(B): pass class D(C): pass
我们看一下顺序
for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")
for cls in [B, C, D]: try: raise cls() except B: print("B") except C: print("C") except D: print("D")
3.引发异常
该raise
语句可以强制发生指定的异常
>>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: HiThere
If an exception class is passed, it will be implicitly instantiated by calling its constructor with no arguments
--如果传递了异常类,则将通过不带参数的构造函数来隐式实例化该异常类。
确定是否引发了异常但不打算处理该异常,则可以使用一种更简单的raise
语句形式来重新引发该异常:
try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise