手记

异常处理

异常之问

  1. 什么是异常?

异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)在Python 中,错误触发的异常如下:

  • Traceback 为异常的追踪信息

  • NameError 为异常的类型

  • name 'a' is not defined 为异常值

在 Python 中的错误分为两种:

  • 语法错误:这种错误,通过不了 python 的语法检测,这种错误也捕捉不了,必须在程序执行前改正.

  • 逻辑异常:语法没问题,通过了 Python的语法检测,但因为对 python 数据类型的错误使用导致出错.

  1. 异常的种类

在 Python 中不同的异常可以用不同的类型( python 中统一了类与类型,类型即类)去标识,一个异常标识一种错误.

常用异常:

AttributeError 试图访问一个对象没有的属性

IOError 输入/输出异常;通常为无法打开文件

ImportError 无法引入模块或包;基本上是路径问题或名称错误

IndentationError 语法错误的子类;代码没有正确对其

IndexError 下标索引超出序列边界

KeyError 试图访问字典中不存在的键

KeyboardInterrupt 键盘终止,通常为 Ctrl+C 同时被按下

NameError 使用一个还未被赋予对象的变量

SyntaxError python 代码非法,代码不能编译

TypeError 传入对象类型与要求的不符合

UnboundLocalError 试图访问一个还未被赋值的局部变量,基本是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError 传入一个调用者不期望的值,即使值得类型是正确的

更多异常:

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarningReferenceErrorRuntimeError
RuntimeWarning
StandardErrorStopIterationSyntaxErrorSyntaxWarning
SystemError
SystemExit
TabErrorTypeErrorUnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
  1. 异常处理

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理.如果错误发生的条件是可预知的,需要用 if 进行处理:在错误发生之前进行预防;如果错误的发生条件不可预知,则需要用 try...except: 在错误发生之后进行处理.

# 基本语法try:
    被检测的代码块except 异常类型:    try 中一旦检测到异常,就执行这个位置的逻辑

几个栗子:

# 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理s1 = 'hello'try:
    int(s1)except IndexError as e: # 捕获异常失败,报错
    print(e)    
# 多分支s1 = 'hello'try:
    int(s1)except IndexError as e:
    print(e)except KeyError as e:
    print(e)except ValueError as e:
    print(e)# 万能异常 Exceptions1 = 'hello'try:
    int(s1)except Exception as e:
    print(e)    
# 多分支异常与万能异常# 如果想要的效果是:无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理它们,那么一个 Exception 就够了.# 如果想要对不同的异常使用不同的处理逻辑,那么就需要用到多分支异常.# 为了防止对异常类型判断错误,可以在多分支后面跟上 Exceptions1 = 'hello'try:
    int(s1)except IndexError as e:
    print(e)except KeyError as e:
    print(e)except ValueError as e:
    print(e)except Exception as e:
    print(e)    
# 异常的其他结构s1 = 'hello'try:
    int(s1)except IndexError as e:
    print(e)except KeyError as e:
    print(e)except ValueError as e:
    print(e)else:
    print('没有产生异常则执行')finally:
    print('无论异常与否,都会执行该代码')    
# 主动触发异常try:    raise TypeError('类型错误')except Exception as e:
    print(e)# 自定义异常class ExceptionMusibii(BaseException):
    def __init__(self, msg):
        self.msg = msg    
    def __str__(self):
        return self.msg    
try:    raise ExceptionMusibii('类型错误')except ExceptionMusibii as e:
    print(e)# 断言: assert 条件assert 1 == 1assert 2 == 2# 总结:try...except# 1. 把错误处理和真正的工作分开来;# 2. 代码更易组织,更清晰,复杂的工作任务更容易实现;# 3. 代码更加健壮,不易崩溃.
  1. 什么时候用异常处理

只有在错误发生的条件无法预知的情况下才应该加上 try...except

原文出处:https://www.cnblogs.com/zuanzuan/p/9892420.html  

0人推荐
随时随地看视频
慕课网APP