小朋友们好,大朋友们好!
我们今天学习异常处理,要学习的内容如下:
什么是异常
异常处理语句try...except
异常处理语句try...except...else
异常处理语句try...except...finally
使用raise语句抛出异常
什么是异常
异常就是运行程序时出现了错误,这种错误有两种。
一种是显式的,错误不修改代码无法运行,比如47.1.1.py。
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
divide()
一种是隐式的,程序可以运行,在某些场合会出问题,比如47.1.2.py当除数是0时。
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
divide()
这两种异常,编程时都需要考虑到。
异常处理语句try...except
try...except可以捕获异常,格式如下:
try:
block1
except [ExceptionName[as alias]]:
block2
block1:可能出现异常的代码
ExceptionName[as alias]:可选参数,用于要捕获的异常。ExceptionName表示要捕获的异常名称。如果加上as alias,表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。except后面是空,表示捕获所有异常。
block2:异常处理代码。可以固定输出固定提示信息,也可以通过别名输出异常的具体内容。
使用try...except语句捕获异常后,程序出错后,程序会继续执行。
猫妹的测试代码见47.2.1.py
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
try:
divide()
except:
print('除数不能为0')
print('和猫妹学Python')
猫妹的测试代码见47.2.2.py
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
try:
divide()
except ZeroDivisionError:
print('除数不能为0')
except ValueError as ve:
print('输入错误',ve)
print('和猫妹学Python')
猫妹的测试代码见47.2.3.py
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
try:
divide()
except (ZeroDivisionError,ValueError) as ve:
print('输入错误',ve)
print('和猫妹学Python')
异常处理语句try...except...else
try...except...else可以捕获异常,格式如下:
try:
block1
except [ExceptionName[as alias]]:
block2
else
block3
try...except...else在try...except语句基础上加了一个else语句,表示当没有错误时执行的代码块。
猫妹的测试代码见47.3.1.py
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
try:
divide()
except:
print('除数不能为0')
else:
print('除法运算执行正常')
print('和猫妹学Python')
异常处理语句try...except...finally
try...except...finally可以捕获异常,格式如下:
try:
block1
except [ExceptionName[as alias]]:
block2
finally
block3
try...except...else在try...except语句基础上加了一个finally语句,不论程序是否异常,都会执行语句块block3.
猫妹的测试代码见47.4.1.py
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
try:
divide()
except:
print('除数不能为0')
finally:
print('hello world')
print('和猫妹学Python')
使用raise语句抛出异常
如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用raise语句在函数或方法抛出异常。
格式如下:
raise [Exception[(reason)]]
Exception[(reason)]为可选参数,用于指定抛出的异常名称以及异常信息的相关描述。如果省略,就会把当前的错误原样抛出。
(reason)也可以省略,如省略,则在抛出异常时,不附带任何描述信息。
猫妹的测试代码见47.5.1.py
#本函数要求:除数小于被除数
def divide():
print('请输入两个数,求它们的商')
a=int(input('请输入被除数:'))
b=int(input('请输入除数:'))
if a < b:
raise ValueError('除数小于被除数了')#抛出异常
ret=a//b
print('它们的商是',ret)
if __name__ == '__main__':
try:
divide()
except (ZeroDivisionError,ValueError) as ve:#捕获异常
print('输入错误',ve)
print('和猫妹学Python')
好了,今天的学习就到这里!
我们下次见!