python异常处理

异常就是程序运行的时候出现了报错(在程序出现错误的时候,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序运行会终止)

image.png

出错类型

1.语法错误(书写错误)
如下面的出错


image.png

2.其他类型的出错

# TypeError
for i in 3:
    pass
TypeError: 'int' object is not iterable
类型错误::int类型不可迭代
----------------------------------------------
# ValueError
inp=input(">>: ") # 输入 qf
int(inp)
ValueError: invalid literal for int() with base 10: 'qf'
值错误:int不能把字符串转换成整型
-----------------------------------------------
# NameError
aaa
NameError: name 'aaa' is not defined
名字错误:名字‘aaa’没有定义
----------------------------------------------
# IndexError
l=['yangge','aa']
l[3]
IndexError: list index out of range
索引错误:数列的索引超出了范围
-----------------------------------------------
# KeyError
dic={'name':'yangge'}
dic['age']
KeyError: 'age'
键错误:没有这个键
-----------------------------------------------
# AttributeError
class Foo:
    pass
Foo.x
AttributeError: type object 'Foo' has no attribute 'x'
属性错误:类型对象‘Foo’没有属性‘x’
-----------------------------------------------
# ZeroDivisionError:无法完成计算
res1=1/0

异常的种类

  • 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
    AttributeError

  • 输入/输出异常;基本上是无法打开文件
    IOError

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

  • 语法错误(的子类) ;代码没有正确对齐
    IndentationError

  • 下标索引超出序列边界,比如当 li 只有三个元素,却试图访问 li[5]
    IndexError

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

  • 按了一下 Ctrl+C
    KeyboardInterrupt(键盘中断)

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

  • 无效语法,语法错误
    SyntaxError

  • 传入对象类型不符合要求,如sum 函数需要的是 int,但你传入了 str
    TypeError

  • 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    UnboundLocalError
    例如:
    """
    x = 1
    def func():
    x += 1
    return x

func()

UnboundLocalError: local variable 'x' referenced before assignment
局部变量 x 在赋值之前被引用
"""

  • 传入一个调用者不期望的值,即使值的类型是正确的,比如 int('a')
    ValueError

异常处理

为了保证程序的健壮和容错性,即在遇到错误的程序时不会中断

1.处理方法

使用try:,,,,,except:,,,,,:可以在发生错误之后进行处理。

try:
   被检测到的代码模块
except 异常类型:
    try中一旦检测到的异常,就执行职工位置的逻辑 
-------------------------------
例子:
def func(arg):
    try:
         arg  +=1
    except TypeError as e:    
 #如果检测到类型错误就把这个类型错误命名为e;
#并输出这个错误的报错
         print(e)
func('ad')      #很明显这是不能用字符串的

2.异常的处理进阶

2.1处理单种错误

def func(arg):
    try:
         arg  +=1
    except TypeError as e:    
 #如果检测到类型错误就把这个类型错误命名为e;
#并输出这个错误的报错
         print(e)
func('ad')    

2.2处理多种异常

try:
    .....
except IndexError as a:
     print(a)
except KeyError as a:
     print(a)
except ValueError as a:
     print(a)
#写多种异常的判断

2.3处理全部异常
Exception 可以匹配全部的错误

x="kja"
try:
    int(x)
except Exception as e:
    print(e)

2.4其他的异常处理结构

x = 'akldk'
try:
    int(x)
except Exception as e:
    print(e) 
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作'如关闭文件、关闭ssh连接、删除日志等)

异常处理(常用)

import traceback   
#这个模块可以用来捕获并打印的所有的异常信息(包括哪里犯了这个错误)
#注意上面的没有使用这个模块的只会打印出是犯了哪种错误
#而不不知道在哪个文件哪个函数哪一行出错了
print('start-->')
try:
    1 + 'a'
except TypeError as e:
    print(e)
    print('*' * 30)
    print(traceback.format_exc())    #这个可以用来接受全部的报错
    print('*' * 20)

print('end')

traceback.print_exc()跟traceback.format_exc()有什么区别呢?
format_exc()返回字符串,print_exc()则直接给打印出来。
即traceback.print_exc()与print traceback.format_exc()效果是一样的。
print_exc()还可以接受file参数直接写入到一个文件。比如
traceback.print_exc(file=open('tb.txt','w+'))
写入到tb.txt文件去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。