Python中的异常处理机制

 

什么是异常与异常处理

异常就是错误

异常会导致程序崩溃并停止运行

能监控并捕获到异常,将异常部位的程序进行修理使得程序继续正常运行

异常的语法结构

try:

    <代码块1> 被try关键字检查并保护的业务代码

except <异常的类型>:

    <代码块2> # 代码块1出现错误后执行的代码块

捕获通用异常

无法确定是哪种异常的情况下使用的捕获方法

try:

    <代码块>

except Exception as e:

    <异常代码块>
def upper(str_data):
    new_str = ''
    try:
        new_str = str_data.upper()
    except Exception as e:
        print('程序出错了:{}'.format(e))
    return new_str

result = upper(1)
print('result:', result)

程序出错了:'int' object has no attribute 'upper'
result: 

捕获具体异常

确定是哪种异常的情况下使用的捕获方法

except <具体的异常类型> as e
def test():
    try:
        print('123')
        1 / 0
        print('hello')
    except ZeroDivisionError as e:
        print(e)

test()

123
division by zero

捕获多个异常1

try:

    print('try start')

    res = 1 / 0

    print('try finish')

except ZeroDivisionError as e:

    print(e)

except Exception as e: # 可以有多个except

    print('this is a public excpt, bug is: %s' %e)

当except代码块有多个的时候,当捕获到第一个后,不会继续往下捕获。

捕获多个异常2

try:
    print('try start')
    res = 1 / 0
    print('try finish')
except (ZeroDivisionError, Exception) as e:
    print(e)

当except代码后边的异常类型使用元组包裹起来,捕获哪种就抛哪种

def test1():
    try:
        print('hello')
        print(name)
    except (ZeroDivisionError, NameError) as e:
        print(e)

test1()

hello
name 'name' is not defined

异常类型集合

异常名称说明
Exception通用异常类型(基类)
ZeroDivisionError不能整除0
AttributeError对象没有这个属性
IOError输入输出操作失败
IndexError没有当前的索引
KeyError没有这个键值(key)
NameError没有这个变量(未初始化对象)
SyntaxErrorPython语法错误
SystemError解释器的系统错误
ValueError传入的参数错误
# coding: utf-8

class Test(object):
    pass

t = Test()
try:
    t.name
except AttributeError as e:
    print(e)

d = {'name': 'xiaomu'}
try:
    d['age']
except KeyError as e:
    print('没有对应的键:', e)

l = [1, 2, 3]
try:
    l[5]
except IndexError as e:
    print(e)

name = 'dewei'
try:
    int(name)
except ValueError as e:
    print(e)

def test(a):
    return a

try:
    test()
except TypeError as e:
    print(e)

finally的功能

无论是否发生异常,一定会执行的代码块

在函数中,即便在try或except中进行了return也依然会执行finally语法块

try语法至少要伴随except或finally中的一个

finally的用法

try:
    <代码块1>
except:
    <代码块2>
finally:
    <代码块3>
def test2():
    try:
        1 / 0
    except Exception as e:
        print('except')
        return e
    finally:
        print('finally')

print('------------')
result = test2()
print(result)

def test5():
    try:
        print('1 try')
        return 'try'
    except Exception as e:
        print('e')
    finally:
        print('2 finally')
        return 'finally'

print('=======')
result = test5()
print(result)

finally的历史

在Python2.5之前的版本,finally需要独立使用,不可以和try配合,之后才演变成现在的模式。

自定义抛出异常函数--raise

将信息以报错的形式抛出

用法:

        rasie 异常类型(message)

参数:

        message:错误信息

返回值:无

def test4(name):
    if name == 'dewei':
        raise Exception('dewei不可以被填写')
    return name

test4('dewei')

自定义异常类

继承基类 Exception

在构造函数中定义错误信息

class NumberLimitError(Exception):
    def __init__(self, message):
        self.message = message

class NameLimitError(Exception):
    def __init__(self, message):
        self.message = message

def test5(name):
    if name == 'dewei':
        raise NameLimitError('dewei不可以被填写')
    return name

def test6(number):
    if number > 100:
        raise NumberLimitError('数字不可以大于100')
    return number

断言的功能--assert

用于判断一个表达式,在表达式条件为false的时候触发异常

断言的用法--assert

用法:

        assert expression, message

参数:

        expression: 表达式,一般是判断相等,或者判断是某种数据类型的bool判断的语句

        message:具体的错误信息

返回值:

        无返回值

bug定义

程序中出现的错误,但有没有通过异常去捕获,以至于直接抛出,导致程序的崩溃。

可以使用debug和断点的方式进行调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python异常处理机制可以帮助我们优雅地处理程序运行过程可能出现的错误或异常情况,避免程序崩溃或产生不可预料的错误结果。 Python异常处理机制基于 `try-except` 语句实现。`try` 语句块用于包裹可能出现异常的代码,`except` 语句块用于处理异常情况。例如: ```python try: # 可能出现异常的代码 except Exception as e: # 异常处理代码 ``` 其,`Exception` 是异常类的基类,可以捕获所有可能出现的异常情况。`as e` 是将异常信息赋值给变量 `e`,可以用于打印错误信息或记录日志等操作。 下面是一个简单的异常处理示例,用于处理除数为零的情况: ```python try: a = 1 / 0 except ZeroDivisionError as e: print("除数不能为零!") ``` 如果程序出现了除数为零的情况,将会输出 `除数不能为零!`。 为了验证Python异常处理机制,我们可以编写一个除法函数,用于计算两个数相除的结果。当除数为零时,抛出 `ZeroDivisionError` 异常。代码如下: ```python def divide(a, b): try: result = a / b except ZeroDivisionError as e: print("除数不能为零!") return None return result ``` 接着,我们可以分别调用 `divide(6, 3)` 和 `divide(6, 0)`,验证程序对正常情况和异常情况的处理: ```python result1 = divide(6, 3) print(result1) # 输出 2.0 result2 = divide(6, 0) print(result2) # 输出 None ``` 可以看到,当除数为零时,程序输出了 `除数不能为零!`,并返回了 `None`。这样我们就可以在程序优雅地处理异常情况,避免了程序崩溃或产生不可预料的错误结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Win_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值