在本文中,我们将通过适当的示例讨论如何使用 try、 except 和 finally 语句在 Python 中处理异常。
Python 中的错误可以有两种类型,即语法错误和异常。错误是程序中出现的问题,导致程序停止执行。另一方面,当发生一些改变程序正常流程的内部事件时,就会引发异常。
在 Python 中,有几个内置异常,当程序执行期间发生错误时可能会引发这些异常。以下是 Python 中一些最常见的异常类型:
这些只是 Python 中可能发生的多种异常类型的几个示例。使用 try-except 块或其他错误处理技术在代码中正确处理异常非常重要,以便优雅地处理错误并防止程序崩溃。
语法错误:顾名思义,此错误是由代码中的错误语法引起的。它导致程序终止。
例子:
# initialize the amount variable amount = 10000 # check that You are eligible to # purchase Dsa Self Paced or not if(amount > 2999) print("You are eligible to purchase Dsa Self Paced")
输出:
异常:当程序语法正确但代码导致错误时,就会引发异常。该错误不会停止程序的执行,但是会改变程序的正常流程。
# initialize the amount variable marks = 10000 # perform division with 0 a = marks / 0 print(a)
在上面的示例中,当我们尝试将数字除以 0 时,引发了 ZeroDivisionError。
\1) TypeError:当对错误类型的对象应用操作或函数时,会引发此异常。这是一个例子:
x = 5 y = "hello" z = x + y # Raises a TypeError: unsupported operand type(s) for +: 'int' and 'str'
output: Traceback (most recent call last): File "7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py", line 4, in <module> z = x + y TypeError: unsupported operand type(s) for +: 'int' and 'str'
x = 5 y = "hello" try: z = x + y except TypeError: print("Error: cannot add an int and a str")
输出
Error: cannot add an int and a str
Try 和 except 语句用于捕获和处理 Python 中的异常。可以引发异常的语句保留在 try 子句中,而处理异常的语句则写在 except 子句中。
示例:让我们尝试访问索引越界的数组元素并处理相应的异常。
# Python program to handle simple runtime error #Python 3 a = [1, 2, 3] try: print ("Second element = %d" %(a[1])) # Throws error since there are only 3 elements in array print ("Fourth element = %d" %(a[3])) except: print ("An error occurred")
Second element = 2 An error occurred
在上面的示例中,可能导致错误的语句被放置在 try 语句中(在我们的例子中是第二个 print 语句)。第二个打印语句尝试访问列表中不存在的第四个元素,这会引发异常。然后这个异常被 except 语句捕获。
一条 try 语句可以有多个 except 子句,以指定不同异常的处理程序。请注意,最多会执行一个处理程序。例如,我们可以在上面的代码中添加IndexError。添加特定异常的一般语法是 –
try: # statement(s) except IndexError: # statement(s) except ValueError: # statement(s)
示例:捕获 Python 中的特定异常
# Program to handle multiple errors with one # except statement # Python 3 def fun(a): if a < 4: # throws ZeroDivisionError for a = 3 b = a/(a-3) # throws NameError if a >= 4 print("Value of b = ", b) try: fun(3) fun(5) # note that braces () are necessary here for # multiple exceptions except ZeroDivisionError: print("ZeroDivisionError Occurred and Handled") except NameError: print("NameError Occurred and Handled")
ZeroDivisionError Occurred and Handled
如果您对 fun(3) 行进行注释,则输出将为
NameError Occurred and Handled
上面的输出之所以如此,是因为只要 python 尝试访问 b 的值,就会发生 NameError。
在 Python 中,您还可以在 try- except 块上使用 else 子句,该块必须出现在所有 except 子句之后。仅当 try 子句不引发异常时,代码才会进入 else 块。
示例:尝试使用 else 子句
# Program to depict else clause with try-except # Python 3 # Function which returns a/b def AbyB(a , b): try: c = ((a+b) / (a-b)) except ZeroDivisionError: print ("a/b result in 0") else: print (c) # Driver program to test above function AbyB(2.0, 3.0) AbyB(3.0, 3.0)
-5.0 a/b result in 0
Python 提供了一个关键字finally,它总是在 try 和 except 块之后执行。Final块总是在try块正常终止之后或者try块由于某种异常而终止之后执行。
句法:
try: # Some Code.... except: # optional block # Handling of exception (if required) else: # execute if no exception finally: # Some code .....(always executed)
# Python program to demonstrate finally # No exception Exception raised in try block try: k = 5//0 # raises divide by zero exception. print(k) # handles zerodivision exception except ZeroDivisionError: print("Can't divide by zero") finally: # this block is always executed # regardless of exception generation. print('This is always executed')
Can't divide by zero This is always executed
raise 语句允许程序员强制发生特定的异常。raise 中的唯一参数指示要引发的异常。这必须是异常实例或异常类(从 Exception 派生的类)。
# Program to depict Raising Exception try: raise NameError("Hi there") # Raise Error except NameError: print ("An exception") raise # To determine whether the exception was raised or not
上面代码的输出将简单地打印为“异常”,但由于最后一行中的 raise 语句,最后也会出现运行时错误。因此,命令行上的输出将类似于
Traceback (most recent call last): File "/home/d6ec14ca595b97bff8d8034bbf212a9f.py", line 5, in <module> raise NameError("Hi there") # Raise Error NameError: Hi there
总体而言,Python 中异常处理的优点大于缺点,但为了保持代码质量和程序可靠性,明智且谨慎地使用它非常重要。
原文链接:codingdict.net