Python中的错误可以分为两种类型,即语法错误和异常。错误是程序中的问题,由于这些问题而导致程序停止执行。另一方面,当某些内部事件发生时,会引发异常,从而改变程序的正常流程。
语法错误:顾名思义,此错误是由代码中的错误语法引起的。它导致程序终止。
例
# initialize the amount variable
amount = 10000
#检查您是否有资格
#是否购买Dsa Self Paced
if(amount>2999)
print("You are eligible to purchase Dsa Self Paced")
输出:
异常:如果程序在语法上正确,但是代码导致错误,则会引发异常。该错误不会停止程序的执行,但是会改变程序的正常流程。
例:
# 初始化数量变量
marks = 10000
#用0执行除法
a = marks / 0
print(a)
输出:
在上面的示例中,由于我们试图将数字除以0,因此引发了ZeroDivisionError。
注意: Exception是Python中所有异常的基类。您可以在此处检查异常层次结构。
让我们尝试访问索引超出范围的数组元素并处理相应的异常。
# Python program to handle simple runtime error
a = [1, 2, 3]
try:
print "Second element = %d" %(a[1])
# 引发错误,因为数组中只有3个元素
print "Fourth element = %d" %(a[3])
except IndexError:
print "An error occurred"
输出:
Second element = 2
An error occurred
一个try语句可以具有多个except子句,以指定不同异常的处理程序。请注意,最多将执行一个处理程序。
# Program to handle multiple errors with one except statement
try :
a = 3
if a < 4 :
# 抛出ZeroDivisionError为a = 3
b = a/(a-3)
# 如果> = 4则抛出NameError
print "Value of b = ", b
# 请注意,对于多个异常,此处需要大括号()
except(ZeroDivisionError, NameError):
print "\nError Occurred and Handled"
输出:
Error Occurred and Handled
如果将“ a”的值更改为大于或等于4,则输出为
Value of b =
Error Occurred and Handled
上面的输出是这样的,因为python一旦尝试访问b的值,就会发生NameError。
在python中,您还可以在该try-except
块上使用else子句,该子句必须出现在所有except子句之后。仅当try子句未引发异常时,代码才进入else块。
# Program to depict else clause with try-except
#返回a / b的函数
def AbyB(a , b):
try:
c = ((a+b) / (a-b))
except ZeroDivisionError:
print "a/b result in 0"
else:
print c
# 驱动程序测试上述功能
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)
上面程序的输出将是:
-5.0
a/b result in 0
Python提供了一个finally关键字,它总是在try和except块之后执行。在try块正常终止后或由于某些异常try块终止后,finally块始终执行。
句法:
try:
# 一些代码...
except:
#可选块
#处理异常(如果需要)
else:
# 如果没有异常则执行
finally:
# 一些代码...(总是执行)
列子:
# Python program to demonstrate finally
# 无异常try块中引发异常
try:
k = 5//0 # 提出除以零的异常。
print(k)
# 处理零分区异常
except ZeroDivisionError:
print("Can't divide by zero")
finally:
#始终执行此块
#不考虑异常的产生。
print('This is always executed')
输出:
Can't divide by zero
This is always executed
引发语句使程序员可以强制发生特定的异常。raise中唯一的参数表示要引发的异常。这必须是异常实例或异常类(从Exception派生的类)。
# 描绘引发异常的程序
try:
raise NameError("Hi there") # 引发错误
except NameError:
print "An exception"
raise # 确定是否引发异常
上面代码的输出将简单地以行打印为“异常”,但由于最后一行的raise语句,最后也会发生运行时错误。因此,命令行上的输出将如下所示
Traceback (most recent call last):
File "003dff3d748c75816b7f849be98b91b8.py", line 4, in
raise NameError("Hi there") # 引发错误
NameError: Hi there