飞道的博客

让你瞬间搞懂Python 错误与异常

411人阅读  评论(0)

Python中有两种错误:语法错误(SyntaxError)和异常。

assert(断言)用于判断一个表达式,在表达式条件为false时触发异常。

Python中的异常类型

异常处理

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError,TypeError,NameError):
	pass

抛出异常 raise:

raise语句有三种常用的用法:

(1)raise:引发当前上下文中捕获的异常(在except块中),或默认引发RuntimeError;

(2)raise 异常类名称:引发该类型的异常;

(3)raise 异常类名称(描述信息):引发指定类型异常的同时,附带异常的描述信息。

>>> raise
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除数为0异常")
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise ZeroDivisionError("除数为0异常")
ZeroDivisionError: 除数为0异常

raise语句引发的一场通常使用try-except异常处理结构来捕获并处理。

try:
    a = input("输入一个数:")
    #判断用户输入的是否为数字
    if(not a.isdigit()):
        raise ValueError("a 必须是数字")
except ValueError as e:
    print("引发异常:",repr(e))

# output:
# 输入一个数:a
# 引发异常: ValueError('a 必须是数字')

自定义异常

Python的异常继承树:

Python中的异常有一个基类BaseException,然后继承的是Exception,我们的自定义类也必须继承Exception,可以直接继承,也可以间接继承。

class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)
   
try:
    raise MyError(2*2)
except MyError as e:
    print("My exception occurred, value:", e.value)

#output:   
# My exception occurred, value: 4

我们定义异常类时,类名通常以“Error”结尾,与标准的异常一样。

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

class Error(Exception):
    """Base class for exceptions in this module."""
    pass
 
class InputError(Error):
    """Exception raised for errors in the input.
 
    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """
 
    def __init__(self, expression, message):
        self.expression = expression
        self.message = message
 
class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.
 
    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """
 
    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

定义清理行为

try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:

try:
	raise KeyboardInterrupt
finally:
	print('Goodbye, world!')

Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

如果一个异常在try子句里(或者在except和else子句里)被抛出,而没有任何的except把它捕获,那么这个异常会在finally子句执行后抛出。


转载:https://blog.csdn.net/weixin_43660661/article/details/105889181
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场