代码改变世界

Python异常处理

2018-06-26 09:27  钱先生  阅读(227)  评论(0编辑  收藏  举报

参考: http://www.cnblogs.com/wupeiqi/articles/5017742.html

常见异常类型

  • AttributeError
    • 试图访问一个对象没有的属性.
  • IOError
    • 输入/输出异常, 通常是无法打开文件(python2.7是这样. python3无法打开文件是FileNotFound)
  • ImportError
    • 无法引入模块或包, 基本上是路径问题或名称错误
  • IndentationError
    • 语法错误(的子类): 代码没有正确对齐(缩进有问题)
    • 这会导致根本没法编译, 所以用try...except...无法抓住这个错误.
  • IndexError
    • 下标索引超出序列边界. 比如当x只有三个元素, 却试图访问x[5]
  • KeyError
    • 试图访问字典里不存在的键
  • KeyboardInterrupt
    • ctrl+C被按下
  • NameError
    • 使用一个还未被赋予对象的变量
  • SyntaxError Python
    • 代码语法错误
    • 这会导致根本没法编译, 所以用try...except...无法抓住这个错误.
  • TypeError
    • 传入对象类型与要求的不符合
  • UnboundLocalError
    • 试图访问一个还未被设置的局部变量, 基本上是由于另有一个同名的全局变量, 导致你以为正在访问它
  • ValueError
    • 传入一个调用者不期望的值, 即使值的类型是正确的
#!/usr/bin/python
# -*- coding: utf-8 -*-



def bulk(self):
    print("%s is yelling...." % self.name)


class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s...", self.name, food)

    def walk(self):
        print("%s is walking...", self.name)


d = Dog("NHY")
choice = input(">>:").strip()

getattr(d, choice)  # 若用户输入的choice不存在, 会报错



names = ['alex', 'jack']
data = {}
data['name']  # name不存在, 会报错. 要捕捉这个错误并进行预处理, 需要try...except.


try:
    names[3]
    data['name']
except KeyError as e:
    print("没有这个key", e)  # e就是获取错误的详细信息. 返回"没有这个key 'name'"
except IndexError as e:
    print("列表操作错误", e) # 也可以不写错误详细信息, 只写except IndexError. 则只返回"列表操作错误."


"""
可以把exception放在一起处理(如下例). 
    劣势: 这样就不知道哪句代码导致了错误, 不方便debug.
    优势: 若不管出哪种错误都可以用同样的处理方法解决, 那就可以这样写, 更简洁.
"""
try:
    names[3]
    data['name']
except (KeyError, IndexError) as e:
    print("没有这个key", e)


"""
一次性把所有错误抓出来 (类似java中的exception), 可以这样写:
"""
try:
    names[3]
    data['name']
    open("text.txt")
except Exception as e:
    print("出错了", e)



"""
异常
    try:
        code
    except (Error1, Error2) as e:
        print (error 描述, e)
        
        
    except Exception: 抓住所有错误, 建议用在最后当做兜底条款.
"""


"""
兜底
    Exception: 其它所有未知错误.
    else: 如果没有任何错误才执行.
    finally : 不管有没有错都执行.
"""
try:
    names[3]
    data['name']
except KeyError as e:  # as 是python3.0写法.  python2.7写法: except KeyError, e:
    print("没有这个key", e)  # e就是获取错误的详细信息. 返回"没有这个key 'name'"
except IndexError as e:
    print("列表操作错误", e)

except Exception as e:   # 其他所有错误
    print("未知错误", e)

else:  # 没有任何错误的时候执行
    print("一切正常")

finally:  # 不管有没有错, 都执行
    print("不管有没有错, 都执行")
异常处理

 

 

自定义异常

#!/usr/bin/python
# -*- coding: utf-8 -*-


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

    def __str__(self):  # 定义打印这个类返回什么格式.
        # return self.message  # print(e)返回"数据库连接失败"
        return 'abcd'  # print(e)返回'abcd'


try:
    raise AlexException('数据库连接失败')  # 触发异常
except AlexException as e:  # e 就是'数据库连接失败'. e返回的格式在__str__()方法里定义.
    print(e)  # 返回"数据库连接失败"