Python自定义异常

时间:2020-02-23 14:42:35  来源:igfitidea点击:

在本教程中,我们将学习Python自定义异常。
如果您不了解Python异常处理,建议您阅读上一教程。

Python自定义异常

在Python异常处理教程中,我们讨论了什么是异常。
基本上,异常是指情况没有相应发展的情况。
在上一教程中,我们讨论了不同类型的内置异常。
但是,有时内置的异常不足以满足我们的需要,那么我们可以定义自己的自定义异常。

使用assert语句的Python自定义异常

使用assert语句,您可以最初创建自己的异常。
基本上断言语句检查条件。
如果不满足条件,则将抛出AssertionError。
假设您编写了一个函数,以年龄作为参数。
如果年龄小于18岁,您不想让程序员使用该功能。

def input_age(age):
 try:
     assert int(age) > 18
 except ValueError:
     return 'ValueError: Cannot convert into int'
 else:
     return 'Age is saved successfully'

print(input_age('23'))  # This will print
print(input_age(25))  # This will print
print(input_age('nothing'))  # This will raise ValueError which is handled
print(input_age('18'))  # This will raise AssertionError and the the program collapse
print(input_age(43))  # This will not print

以下程序的输出将是

Age is saved successfully
Age is saved successfully
ValueError: Cannot convert into int

Traceback (most recent call last):
File "/home/imtiaz/ExceptionHandling.py", line 13, in 
  print(input_age('18'))  # This will raise AssertionError the the program collapse
File "/home/imtiaz/ExceptionHandling.py", line 3, in input_age
  assert int(age) > 18
AssertionError

引发异常

您可以使用raise关键字引发现有异常。
因此,您只需要简单地写上raise关键字,然后写上异常的名称即可。
如果我们修改前面的代码,我们得到

def input_age(age):
 try:
     if(int(age)<=18):
         raise ZeroDivisionError
 except ValueError:
     return 'ValueError: Cannot convert into int'
 else:
     return 'Age is saved successfully'

print(input_age('23'))  # This will execute properly
print(input_age('18'))  # This will not execute properly

代码的输出将是

Age is saved successfully
Traceback (most recent call last):
File "/home/imtiaz/ExceptionHandling.py", line 12, in 
  print(input_age('18'))  # This will not print
File "/home/imtiaz/ExceptionHandling.py", line 4, in input_age
  raise ZeroDivisionError
ZeroDivisionError

虽然,该异常不是由于被零除,但还是可以看到。
因为我们提出了ZeroDivisionError。

Python自定义异常类

Python允许程序员创建自己的异常类。
通常,异常应该直接或者间接地从Exception类派生。
在以下示例中,我们创建自基类Exception派生的自定义异常类" UnderAge"。

同样,在另一种方法中,如果不满足条件,则引发UnderAge异常。
以下代码将使您对该想法有所了解。

class UnderAge(Exception):
 pass

def verify_age(age):
 if int(age) < 18:
     raise UnderAge
 else:
     print('Age: '+str(age))

# main program
verify_age(23)  # won't raise exception
verify_age(17)  # will raise exception