python异常
作者:互联网
try/except 语句
异常捕捉可以使用 try/except
语句。
try:
1/0
except Exception as error:
print('发生如下错误:',error)
try
语句按照如下方式工作:
- 首先,执行
try
子句(在关键字try
和关键字except
之间的语句)。 - 如果没有异常发生,忽略
except
子句,try
子句执行后结束。 - 如果在执行
try
子句的过程中发生了异常,那么try
子句余下的部分将被忽略。如果异常的类型和except
之后的名称相符,那么对应的except
子句将被执行。 - 如果一个异常没有与任何的
except
匹配,那么这个异常将会传递给上层的try
中。
一个 try
语句可能包含多个 except
子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try
子句中的异常进行处理,而不是其他的 try
的处理程序中的异常。
一个 except
子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:
except (RuntimeError, TypeError, NameError):
pass
try/except...else 语句
try/except
语句还有一个可选的 else
子句,如果使用这个子句,那么必须放在所有的 except
子句之后。
else
子句将在 try
子句没有发生任何异常的时候执行。
以下实例在 try
语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else
部分的语句,读取文件内容:
# 正常打开
try:
with open('solution.py', 'r') as f:
line = f.read()
except:
print('出错了')
else:
print('没有出错了')
# 可以通过 print line 来查看文件内容
# print(line)
# # 出现异常
# try:
# with open('NotExistFile.py', 'r') as f:
# line = f.read()
# except:
# print('出错了')
# else:
# print('没有出错了')
try-finally 语句
try-finally
语句无论是否发生异常都将执行最后的代码。
try:
1/1
except:
print('出错了')
else:
print('没有出错了')
finally:
print('不管有没有出错,我100%会执行')
raise
语句
raise [exceptionName [(reason)]]
其中,用 []
括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise
会把当前错误原样抛出;如果仅省略 (reason)
,则在抛出异常时,将不附带任何的异常描述信息。
也就是说,raise
语句有如下三种常用的用法:
raise
:单独一个raise
。该语句引发当前上下文中捕获的异常(比如在except
块中),或默认引发RuntimeError
异常。raise
异常类名称:raise
后带一个异常类名称,表示引发执行类型的异常。raise
异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
显然,每次执行 raise
语句,都只能引发一次执行的异常。首先,我们来测试一下以上 3 种 raise
的用法:
raise
# raise ZeroDivisionError
# raise ZeroDivisionError("除数不能为零")
当然,我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise
语句引发的异常通常用 try except (else finally)
异常处理结构来捕获并进行处理。例如:
try:
a = 'hello'
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))
可以看到,当用字符串 a
不是数字时,程序会进入 if
判断语句,并执行 raise
引发 ValueError
异常。但由于其位于 try
块中,所以 raise
抛出的异常会被 try
捕获,并由 except
块进行处理。
因此,虽然程序中使用了 raise
语句引发异常,但程序的执行是正常的,手动抛出的异常并不会导致程序崩溃
正如前面所看到的,在使用 raise
语句时可以不带参数,例如:
try:
a = 'hello'
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))
raise
Traceback (most recent call last):
File "/code/main.py", line 2, in
import solution
File "/code/solution.py", line 4, in
raise ValueError("a 必须是数字")
ValueError: a 必须是数字
商店年终促销,给定一个黑名单列表 blacklist
和一个顾客列表 customers
,请你严格把关,完成函数 selection
。
- 如果遇到黑名单上的人,请你抛出给定的异常
DiscoverBlacklist
,并附加信息:
Alert, NAME is on the blacklist.(NAME 为出现在黑名单上的人名)
- 如果没有发现,请返回:
Welcome to the next visit
class DiscoverBlacklist(Exception):
pass
def selection(blacklist: list, customers: list):
# please write your code here
for customer in customers:
if customer in blacklist:
raise DiscoverBlacklist('Alert, %s is on the blacklist.' % customer)
return 'Welcome to the next visit'
自定义异常
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception
类,可以直接继承,或者间接继承,例如:
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2 * 2)
except MyError as e:
print('My exception occurred, value:', e.value)
raise MyError('oops!')
给定一个函数 print_avg
,这个函数接收多个关键字参数作为学生的信息,接收多个数字参数作为这个学生多次考试的成绩。
但是,在给定的关键字参数中不一定会存在 student_name
,student_age
,给定的数字参数中也不一定全部是数字,也可能存在字符串,请你自定义两个异常 KeywordNotFound
,NotAllNumbers
。
- 在关键字不全时,请你抛出
KeywordNotFound
异常并附加信息:
Incomplete keywords
- 当数字参数中不全是数字时,请你抛出
NotAllNumbers
异常并附加信息:
It's not all about numbers
- 如果没有异常,请从学生信息中提取出学生的
student_name
,student_age
,然后求出这个学生 n 次考试的平均成绩Average
(保留两位小数),返回一个字符串,格式如下:
name: student_name, age: student_age, avg: Average
# Please define the exception here
class KeywordNotFound(Exception):
# __str__方法需要返回一个字符串,当做这个对象的描写
def __str__(self):
return "Incomplete keywords"
class NotAllNumbers(Exception):
def __str__(self):
return "It's not all about numbers"
def print_avg(*args, **kwargs) -> str:
# Please write your code here
try:
if 'student_name' not in kwargs or 'student_age' not in kwargs:
raise KeywordNotFound
for i in args:
if type(i) is not int:
raise NotAllNumbers
except (KeywordNotFound, NotAllNumbers) as e:
return e
else:
name = kwargs["student_name"]
age = kwargs["student_age"]
avg = sum(args)/len(args)
return ("name: %s, age: %s, avg: %.2f"%(name, age, avg))
标签:语句,raise,python,except,try,print,异常 来源: https://www.cnblogs.com/changethewld/p/16316107.html