编程语言
首页 > 编程语言> > python异常

python异常

作者:互联网

try/except 语句

异常捕捉可以使用 try/except 语句。

try:
    1/0
except Exception as error:
    print('发生如下错误:',error)

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 语句,都只能引发一次执行的异常。首先,我们来测试一下以上 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

  1. 如果遇到黑名单上的人,请你抛出给定的异常 DiscoverBlacklist,并附加信息:
Alert, NAME is on the blacklist.(NAME 为出现在黑名单上的人名) 
  1. 如果没有发现,请返回:
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_namestudent_age,给定的数字参数中也不一定全部是数字,也可能存在字符串,请你自定义两个异常 KeywordNotFoundNotAllNumbers

  1. 在关键字不全时,请你抛出 KeywordNotFound 异常并附加信息:
Incomplete keywords
  1. 当数字参数中不全是数字时,请你抛出 NotAllNumbers 异常并附加信息:
It's not all about numbers
  1. 如果没有异常,请从学生信息中提取出学生的 student_namestudent_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