📅  最后修改于: 2021-01-04 04:46:02             🧑  作者: Mango
通常,任何异常情况都是例外。异常通常表示错误,但有时会故意将其放入程序中,例如提前终止过程或从资源短缺中恢复过来。有许多内置的异常,这些异常指示诸如读取超出文件末尾或除以零的条件。我们可以定义自己的异常,称为自定义异常。
异常处理使您可以优雅地处理错误并对其进行有意义的处理。异常处理具有两个组成部分:“引发”和“捕捉”。
Python发生的每个错误都会导致异常,该异常将由其错误类型标识错误条件。
>>> #Exception
>>> 1/0
Traceback (most recent call last):
File "", line 1, in
1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
File "", line 1, in
print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)
SyntaxError: EOL while scanning string literal
>>> #Above we have not closed the quote in a string, so we get SyntaxError.
>>>
>>> #Below we are asking for a key, that doen't exists.
>>> mydict = {}
>>> mydict['x']
Traceback (most recent call last):
File "", line 1, in
mydict['x']
KeyError: 'x'
>>> #Above keyError
>>>
>>> #Below asking for a index that didn't exist in a list.
>>> mylist = [1,2,3,4]
>>> mylist[5]
Traceback (most recent call last):
File "", line 1, in
mylist[5]
IndexError: list index out of range
>>> #Above, index out of range, raised IndexError.
当程序中发生异常事件并希望使用异常机制进行处理时,您将“引发异常”。关键字try和except用于捕获异常。每当try块中发生错误时, Python寻找匹配的除外块来处理它。如果有一个,执行将跳到那里。
try:
#write some code
#that might throw some exception
except :
# Exception handler, alert the user
try子句中的代码将逐条语句执行。
如果发生异常,将跳过try块的其余部分,并执行except子句。
try:
some statement here
except:
exception handling
让我们编写一些代码,看看在程序中不使用任何错误处理机制时会发生什么。
number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)
只要用户输入数字,上述程序就可以正常工作,但是如果用户尝试输入其他数据类型(如字符串或列表),会发生什么情况。
Please enter the number between 1 > 10: 'Hi'
Traceback (most recent call last):
File "C:/Python/Python361/exception2.py", line 1, in
number = int(input('Please enter the number between 1 & 10: '))
ValueError: invalid literal for int() with base 10: "'Hi'"
现在,ValueError是一个异常类型。让我们尝试用异常处理重写上面的代码。
import sys
print('Previous code with exception handling')
try:
number = int(input('Enter number between 1 > 10: '))
except(ValueError):
print('Error..numbers only')
sys.exit()
print('You have entered number: ',number)
如果运行该程序,然后输入一个字符串(而不是数字),我们可以看到得到了不同的结果。
Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only
要从您自己的方法引发异常,您需要使用raise关键字,例如
raise ExceptionClass(‘Some Text Here’)
让我们举个例子
def enterAge(age):
if age<0:
raise ValueError('Only positive integers are allowed')
if age % 2 ==0:
print('Entered Age is even')
else:
print('Entered Age is odd')
try:
num = int(input('Enter your age: '))
enterAge(num)
except ValueError:
print('Only positive integers are allowed')
运行程序并输入正整数。
Enter your age: 12
Entered Age is even
但是当我们尝试输入负数时,我们得到
Enter your age: -2
Only positive integers are allowed
您可以通过扩展BaseException类或BaseException的子类来创建自定义异常类。
从上图可以看出, Python的大多数异常类都是从BaseException类扩展而来的。您可以从BaseException类或其子类派生自己的异常类。
创建一个名为NegativeNumberException.py的新文件,并编写以下代码。
class NegativeNumberException(RuntimeError):
def __init__(self, age):
super().__init__()
self.age = age
上面的代码创建了一个名为NegativeNumberException的新异常类,该异常类仅由使用super()__ init __()调用父类构造函数并设置年龄的构造函数组成。
现在创建您自己的自定义异常类,将编写一些代码并导入新的异常类。
from NegativeNumberException import NegativeNumberException
def enterage(age):
if age < 0:
raise NegativeNumberException('Only positive integers are allowed')
if age % 2 == 0:
print('Age is Even')
else:
print('Age is Odd')
try:
num = int(input('Enter your age: '))
enterage(num)
except NegativeNumberException:
print('Only positive integers are allowed')
except:
print('Something is wrong')
Enter your age: -2
Only positive integers are allowed
创建自定义Exception类的另一种方法。
class customException(Exception):
def __init__(self, value):
self.parameter = value
def __str__(self):
return repr(self.parameter)
try:
raise customException('My Useful Error Message!')
except customException as instance:
print('Caught: ' + instance.parameter)
Caught: My Useful Error Message!
内置异常的类层次结构是-
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning