一般情况下,异常是任何异常情况.例外通常表示错误,但有时他们故意放入程序,例如提前终止程序或从资源短缺中恢复.有许多内置异常,表示读取文件末尾或除以零等条件.我们可以定义自己的异常,称为自定义异常.
异常处理使您可以优雅地处理错误并对其执行一些有意义的操作.异常处理有两个组成部分:"抛出"和"捕获".
识别异常(错误)
Python中发生的每个错误都会导致异常将由错误类型标识的错误条件.
>>> #Exception>>> 1/0Traceback (most recent call last): File "", line 1, in 1/0ZeroDivisionError: 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都会查找匹配的except块来处理它.如果有,则执行跳转.
语法
try: #write some code #that might throw some exceptionexcept: # Exception handler, alert the user
try子句中的代码将逐个语句执行.
如果发生异常,将跳过try块的其余部分,并执行except子句.
try: some statement hereexcept: exception handling
让我们编写一些代码,看看当你在程序中没有使用任何错误处理机制时会发生什么.
number = int(input('Please enter the number between 1 & 10: '))print('You have entered number',number)
只要用户输入一个数字,上述程序就能正常工作,但会发生什么s如果用户试图放入一些其他数据类型(如字符串或列表).
Please enter the number between 1 > 10: 'Hi'Traceback (most recent call last): File "C:/Python/Python361/exception2.py", line 1, innumber = int(input('Please enter the number between 1 & 10: '))ValueError: invalid literal for int() with base 10: "'Hi'"
现在ValueError是一种异常类型.让我们尝试用异常处理重写上面的代码.
import sysprint('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 handlingEnter 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: 12Entered Age is even
但是当我们尝试e我们得到一个负数,
预期输出
Enter your age: -2Only 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 __()调用父类构造函数的构造函数,并设置年龄./p>
现在要创建自己的自定义异常类,将编写一些代码并导入新的异常类.
from NegativeNumberException import NegativeNumberExceptiondef 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: -2Only 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