Python基础之异常

Python基础之异常

本节将介绍异常的基本概念,语法,异常类结构,自定义异常以及主动抛出异常等内容。


异常是指程序遇到错误导致无法继续执行时突然中止的一种现象。比如,两个数相除,如果除数为0,程序将无法继续执行,如果此时没有显示的指定如果处理,那么程序将强制退出。Python中的异常相对Java的要简单一些,没有运行时异常和非运行时异常之分。

语法

异常的语法通过 tryexceptelsefinally 等关键字来定义。例如:

try:
    pass
except ZeroDivisionError as e:
    pass
except (ValueError, ArithmeticError) as e:
    pass
else:
    pass
finally:
    pass

except子句中可以跟一个或多个异常类,表示如果try中的语句出现了给定的异常,程序将进入相应的except子句中。else定义在没有任何异常情况下将执行的语句,finally定义无论是否出现异常始终都要执行的语句。例如:

def divide(num1, num2):
    result = 0
    try:
        result = num1 / num2
    except ZeroDivisionError as e:
        print("ZeroDivisionError happened, %r" % e)
    except Exception as e:
        print("Exception happened, %r" % e)
    else:
        print("No error happened.")
    finally:
        print("Finally statement.")
    return result


print(divide(4, 2))
print()
print(divide(4, 0))
print()
print(divide(4, 'abc'))

运行结果:

D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_07/except_2.py
No error happened.
Finally statement.
2.0

ZeroDivisionError happened, ZeroDivisionError('division by zero')
Finally statement.
0

Exception happened, TypeError("unsupported operand type(s) for /: 'int' and 'str'")
Finally statement.
0

Process finished with exit code 0

异常类结构

本节引用自 https://blog.csdn.net/gaoxin12345679/article/details/47017483?utm_source=blogxgwz7, 并做了一些修改和补充。

BaseException 所有内建异常的基类,继承自object类
 +-- SystemExit 由sys.exit()函数引发。当它不处理时,Python 解释器退出
 +-- KeyboardInterrupt 当用户点击中断键 (通常ctrl + C) 时引发
 +-- GeneratorExit 当调用一种generator的close()方法时引发。它直接继承BaseException而不是Exception,因为它是从技术上讲不是一个错误。
 +-- Exception 所有内置的,非系统退出异常是从该类派生的。应该从该类派生所有用户定义的异常。
      +-- StopIteration
      +-- ArithmeticError 算数类异常
      |    +-- FloatingPointError 浮点数异常
      |    +-- OverflowError
      |    +-- ZeroDivisionError 除数为0异常
      +-- AssertionError
      +-- AttributeError
      +-- BufferError 当缓冲区相关的操作无法执行时引发
      +-- EOFError 当input()函数在文件尾(EOF)的条件下没有读到任何数据时被引发
      +-- ImportError 当import语句无法找到模块定义时引发
      +-- LookupError 当用于映射或序列的键或索引无效时引发
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError 当OOM时被引发,但是其状态仍然能被拯救
      +-- NameError 当一个局部或者全局的名字没有找到时被引发
      |    +-- UnboundLocalError
      +-- OSError 当一个系统函数返回一个与系统相关的错误时引发。
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError 当访问一个已经被GC的对象时被引发
      +-- RuntimeError 当一个错误不能被其他所有的错误检测到时被引发
      |    +-- NotImplementedError
      +-- SyntaxError 当解析器遇到语法错误时引发。非运行时错误。
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError 当解释器发现一个内部错误时引发
      +-- TypeError 当一个操作符或者函数应用到一个不合适的对象时引发
      +-- ValueError 当一个内置操作符或函数接收到一个类型正确但是值不合适的时候被引发
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

自定义异常类和抛出异常

可创建一个自定义的异常类,一般情况下自定义异常类都应该继承自Exception类。可通过关键字raise主动抛出一个异常,让外层来处理此异常。例如:

class MyError(Exception):
    pass


try:
    print("Before raise error.")
    raise MyError('This is a testing error.')
    print("After raise error.")
except MyError as e:
    print("MyError occurred, %r" % e)
finally:
    print("Finally statement.")

运行结果:

D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_07/my_exception.py
Before raise error.
MyError occurred, MyError('This is a testing error.')
Finally statement.

Process finished with exit code 0

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值