python异常处理

Python 异常处理机制会涉及 try、except、else、finally 这 4 个关键字和 raise 语句 。

Python 编写程序时遇到的异常可大致分为 2 类:语法错误和运行时异常

运行时异常:即程序在语法上都是正确的,但在运行时发生了错误。把在运行期检测到的错误被称为异常(Exceptions)

常见的运行时异常如下:

  • NameError:尝试访问一个未声明的变量时,引发此异常
  • IndexError :索引超出序列范围会引发此异常
  • KeyError:字典中查找一个不存在的关键字时引发此异常
  • TypeError:不同类型数据之间的无效操作
  • ZeroDivisionError:除法运算中除数为 0 引发此异常
  • AttributeError:当试图访问的对象属性不存在时抛出的异常

异常处理

try/except

使用 try except语句捕获并处理异常,其基本语法格式如下:

try:
    可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
    处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
    处理异常的代码块2
except  [Exception]:
    处理其它异常
  • 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。
  • 一个except子句可以同时处理一个或者多个异常,这些异常将被放在一个括号里成为一个元组。

如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。Python 解释器会寻找能处理该异常对象的 except 块,如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。

try/except…else

try/except 语句还有一个可选的 else 子句,在except 子句之后添加一个 else 子句,即try except else结构。

其基本语法格式如下:

try:
    可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
    处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
    处理异常的代码块2
except  [Exception]:
    处理其它异常
else:
    try没有发生任何异常的时,才会执行的语句
  • else 子句含义只有在 try 子句没有发生任何异常的时候执行 else 块中的代码。否则不执行它。else 子句必须放在所有的 except 子句之后。
try:
    a = int(input("输入被除数:"))
    b = int(input("输入除数:"))
    c = a / b
    print("您输入的两个数相除的结果是:", c)
except (ValueError, ArithmeticError):
    print("程序发生了数字格式异常、算术异常之一")
except ZeroDivisionError:
    print("除数不能为0")
except Exception as e:
    # 访问异常的错误编号和详细信息
    print(e.args)
    print(str(e))
    print(repr(e))
else:
    print('没有出现任何异常')

print("程序继续向下运行")
try-finally

try-finally 语句基本语法格式如下:

try:
    可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
    处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
    处理异常的代码块2
except  [Exception]:
    处理其它异常
else:
    try没有发生任何异常的时,才会执行的语句
finally:
    无论 try 块是否发生异常都会执行的语句

在整个异常处理机制中,finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。

注意:和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。

try:
    a = int(input("请输入 a 的值:"))
    print(20/a)
except:
    print("发生异常!")
else:
    print("执行 else 块中的代码")   
finally :
    print("执行 finally 块中的代码")

抛出异常 

Python 使用 raise 语句抛出一个指定的异常。

raise语法格式如下:

raise [exceptionName [(reason)]]

也就是说,raise 语句有如下三种常用的用法:

  • raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  • raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
  • raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
try:
    a = input("输入被除数:")
    # 判断用户输入的是否为数字
    if (not a.isdigit()):
        # raise
        # raise ValueError()
        raise ValueError("a 必须是数字")

    b = int(input("输入除数:"))
    c = a / b
    print("您输入的两个数相除的结果是:", c)
except ValueError as e:
    print("引发异常:", repr(e))
except [RuntimeError, TypeError]:
    raise
except Exception as e:
    # 访问异常的错误编号和详细信息
    print(e.args)
    print(str(e))
    print(repr(e))
except:
    print("未知异常")

自定义异常 

  • 你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
  • 下面是一个引发异常的例子:
class ShortInputException(Exception):
    '''自定义的异常类'''
    def __init__(self, length, atleast):
        #super().__init__()
        self.length = length
        self.atleast = atleast

def main():
    try:
        s = input('请输入 --> ')
        if len(s) < 3:
            # raise引发一个你定义的异常
            raise ShortInputException(len(s), 3)
    except ShortInputException as result:#x这个变量被绑定到了错误的实例
        print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))
    else:
        print('没有异常发生.')

main()
  • 情况1
请输入 --> hello
没有异常发生.
  • 情况2
请输入 --> la
ShortInputException: 输入的长度是 2,长度至少应是 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值