35-异常处理

作者: ju7ran | 来源:发表于2019-04-19 19:29 被阅读1次

异常处理

在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的,比如语法错误、调用错误,甚至逻辑错误。还有一些错误,则是不可预料的错误,但是完全有可能发生的,比如文件不存在、磁盘空间不足、网络堵塞、系统错误等等。这些导致程序在运行过程中出现异常中断和退出的错误,我们统称为异常。大多数的异常都不会被程序处理,而是以错误信息的形式展现出来。

异常有很多种类型,Python内置了几十种常见的异常,就在builtins模块内,无需特别导入,直接就可使用。需要注意的是,所有的异常都是异常类,首字母是大写的!

10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero

-------------------------------------
4 + spam*3 
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
-------------------------------------
'2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly

为了保证程序的正常运行,提高程序健壮性和可用性。我们应当尽量考虑全面,将可能出现的异常进行处理,而不是留在那里,任由其发生。

Python内置了一套try...except...finally(else)...的异常处理机制,来帮助我们进行异常处理。其基本语法是:

try:
    pass
except Exception as ex:
    pass

try…except…语句处理异常的工作机制如下:

  1. 首先,执行try子句(在关键字try和关键字except之间的语句)
  2. 如果没有异常发生,忽略except子句,try子句执行后结束。
  3. 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。
try:
    print("发生异常之前的语句正常执行")
    print(1/0)
    print("发生异常之后的语句不会被执行")
except ZeroDivisionError as e:
    print(e)
--------------
结果:
发生异常之前的语句正常执行 
division by zero

如果程序发生的异常不在你的捕获列表中,那么依然会抛出别的异常。

# 未捕获到异常,程序直接报错
s1 = 'hello'
try:
    int(s1)
except IndexError as ex:    # 本例为非法值异常,而你只捕获索引异常
    print(ex)
--------------------------------------------------------------
Traceback (most recent call last):
  File "F:/Python/pycharm/201705/1.py", line 5, in <module>
    int(s1)
ValueError: invalid literal for int() with base 10: 'hello'

如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中

try:
    try:
        print("发生异常之前的语句正常执行")
        print(1/0)
        print("发生异常之后的语句不会被执行")
    except ValueError as e:
        print(e)

except ZeroDivisionError as e:
    print("里层没有抓好,只能辛苦我外层了")

文件读写异常处理

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
        pass

    finally:
        f.close()
        print('关闭文件')
except Exception:
    print('没有这个文件')

可能包含多个except子句,分别来处理不同的特定的异常

try:
    print("发生异常之前的语句正常执行")
    print(1/0)
    print("发生异常之后的语句不会被执行")
except NameError as e:
    print(e)
except ZeroDivisionError as e:
    print("我是第一个抓取到除零异常的")
    
-----------------------------------------
发生异常之前的语句正常执行
我是第一个抓取到除零异常的


捕获多个异常
try:
    print("发生异常之前的语句正常执行")
    print(1/0)
    open("xxx.txt")
    print("发生异常之后的语句不会被执行")
except (ZeroDivisionError,FileNotFoundError) as e:
    print(e)

通用异常:Exception

在Python的异常中,有一个通用异常:Exception,它可以捕获任意异常。

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print('错误')
finally:
    print("finally被执行")

主动抛出异常:raise

很多时候,我们需要主动抛出一个异常。Python内置了一个关键字raise,可以主动触发异常。

>>> raise
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise
RuntimeError: No active exception to reraise
>>> raise NameError("kkk")
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise NameError("kkk")
NameError: kkk


自定义异常类抛出
class ShortInputException(Exception):
    def __init__(self,info):
        self.info = info


def main():
    try:
        s = "ab"
        if len(s) < 3:
            raise  ShortInputException("长度不够")
    except ShortInputException as e:
        print(e)
main()

自定义异常

Python内置了很多的异常类,并且这些类都是从BaseException类派生的。

image.png

相关文章

  • 35-异常处理

    异常处理 在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的,比如语法错误、调用错...

  • 同步或异步异常处理

    同步或异步异常处理 同步读取异常处理 异步读取文件异常处理

  • Java 异常

    异常处理机制 异常处理模型:终止模型:当异常发生时,就进入异常处理程序,处理结束并不返回异常发生位置继续执行;恢复...

  • 第十二章:异常处理

    异常处理语法格式: try: ...处理语句 except 异常类型: ...异常处理语句 pytho...

  • Spring MVC 全局统一异常处理(注解方式)

    全局异常处理 对异常处理类增加@ControllerAdvice 增加异常处理方法,使用@ExceptionHan...

  • 异常处理设计文档

    一、异常处理流程说明 在ESB处理过程中,若发生异常,将进入异常流程的处理。一个异常处理流程大致如下: ESB处理...

  • Java异常处理机制

    什么是异常处理机制: 异常处理机制: 让程序发生异常时,按照代码预先设定的异常处理逻辑,针对性地处理异常,让程序尽...

  • ASP .NET Core Web API_05_异常处理

    默认异常处理 自定义异常处理

  • springboot 异常捕获和处理

    springboot 异常捕获和处理 异常捕获处理

  • NDK开发---C++学习(七):异常

    前言 C++的异常处理机制能够将异常检测与异常处理分离开来,当异常发生时,它能自动调用异常处理程序进行错误处理。把...

网友评论

    本文标题:35-异常处理

    本文链接:https://www.haomeiwen.com/subject/mvwcgqtx.html