2.3 python学习笔记

13)错误和异常

1. 异常

AttributeError:属性错误,特性引用和赋值失败时会引发属性错误(访问未知对象属性)

NameError:试图访问的变量名不存在

SyntaxError:语法错误,代码形式错误

Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions python 模块中定义。

IOErrorpython ioerror,一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误

KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误(字典关键字不存在)

IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引python list index

TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误

ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误

ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。

AssertionError:断言错误

LookupError:键、值不存在引发的异常,LookupError异常是IndexError、KeyError的基类, 如果你不确定数据类型是字典还是列表时,可以用LookupError捕获此异常。

StandardError: 标准异常,错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束。

https://www.iplaypy.com/jinjie/jj158.html

2. 错误处理

try-except-else-finally语句

 

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError, TypeError, NameError):
     pass

例子:

try:
    x = int(input("请输入一个数字: "))
except NameError as nam:
    print("Wrong!", nam)
except ValueError as val:
    print(("请输入数字!"), val)
else:
    try:
        y = int(input("在输入一个数字:"))
    except ValueError as vals:
        print(("请输入数字!"), vals)
    else:
        print('输出:',x + y)
finally:
    print('反正会输出的,管他那么多')

注1:如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中,如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如上所示的消息。

# err.py:
def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    bar('0')

main()

##执行,结果如下: $ python3 err.py Traceback (most recent call last): File
"err.py", line 11, in <module> #错误位置 main() File "err.py", line 9, in main #错误位置 bar('0') File "err.py", line 6, in bar #错误位置 return foo(s) * 2 File "err.py", line 3, in foo #错误位置 return 10 / int(s) ZeroDivisionError: division by zero

注2: 如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。

3. 记录错误

如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。

Python内置的logging模块可以非常容易地记录错误信息:

# err_logging.py

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)
main()
print('END')

同样是出错,但程序打印完错误信息后会继续执行,并正常退出:

$ python3 err_logging.py
ERROR:root:division by zero
Traceback (most recent call last):
  File "err_logging.py", line 13, in main
    bar('0')
  File "err_logging.py", line 9, in bar
    return foo(s) * 2
  File "err_logging.py", line 6, in foo
    return 10 / int(s)
ZeroDivisionError: division by zero
END

4. 抛出错误

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

raise语法格式如下:

raise [Exception [, args [, traceback]]]

 

 5.  用户定义异常

 

6. 断言

凡是用print()来辅助查看的地方,都可以用断言(assert)来替代

 

 语法格式

assert expression [, arguments]  ##[]表示可选参数 可以是字符串

例如:

>>> assert True     # 条件为 true 正常执行
>>> assert False    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1==1    # 条件为 true 正常执行
>>> assert 1==2    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 不等于 2

注: 启动Python解释器时可以用-O参数来关闭assert:,断言的开关“-O”是英文大写字母O,不是数字0。

 

 

 

 

posted @ 2020-02-03 16:25  德狗咬不过狗  阅读(275)  评论(0编辑  收藏  举报