25-2 python中的异常处理


1. 基础

在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!

try:
    pass                            # 可能会出现错误的代码块
except Exception as e:              # e是Exception对象,里面封装了错误信息。e只是一个变量名,可以自己起
    pass                            # 若出错,代而执行的代码块
while True:
    try:
        inp = input(">>:")
        i = int(inp)                  # 当inp不是数字型文本时,会出错
        print(i)
    except Exception as e:
        print("出现异常,信息如下:")
        print(e)
示例

2. 异常种类

python中的异常种类非常多,常见的异常种类:

AttributeError     试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError            输入/输出异常;基本上是无法打开文件
ImportError        无法引入模块或包;基本上是路径问题或名称错误
IndentationError   语法错误(的子类) ;代码没有正确对齐
IndexError         下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
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
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常
更多种异常

每个异常专门用于处理某一项异常,对于其它异常无法处理:

try:
    int("abc")
except ValueError as e:             # 只能捕获 ValueError 异常。若是其他异常,程序直接报错!
    print(e)                        # invalid literal for int() with base 10: 'abc'

所以,写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:

try:
    int('hello')
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

在python的异常中,有一个万能异常:Exception,他可以捕获任意异常(实际上其它错误类型,都继承自Exception类)。

既然有这个万能异常,其他异常是不是就可以忽略了?当然不是,对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。

try:
    int('hello')
except IndexError as e:
    print("索引错误!")
except KeyError as e:
    print("键错误!")
except Exception as e:
    print("错误!")

3. 异常其它结构

try:
    pass                            # 主代码块
except Exception as e:
    pass                            # 异常时,执行该块
else:
    pass                            # 主代码块执行完无异常执时,执行该块。有异常时会跳过该块的执行。
finally:
    pass                            # 无论异常与否,最终都要执行该块

4. 主动触发异常

try:
    raise Exception("不过了...")     # 创建一个Exception对象
except Exception as e:              # 将对象赋值给e
    print(e)
def db():
    return False

def index():
    try:
        result = db()
        if not result:                          # 数据库未连接时主动触发异常,以将其写入日志
            raise Exception('数据库连接错误!')
        pass
    except Exception as e:
        log = open('log.txt', 'w')
        log.write(str(e))
        log.close()

index()
示例

5. 自定义异常

class myException(Exception):      # 所有的错误类都继承自Exception
    def __init__(self, msg):
        self.message = msg
    def __str__(self):
        return self.message

# e = myException('我的异常')
# print(e)

try:
    raise myException('我的异常')    # 相当于创建对象 myException('我的异常')
except myException as e:            # 相当于将创建的对象赋值给e  e=myException('我的异常')
    print(e)                        # print时,执行e对象中的__str__方法

6. 断言

语法为assert关键字后加条件。验证条件不成立时,报错(此报错放在try块里可捕获,但一般不捕获,就是为了强制用户服从条件)

print(123)
assert 1==1                         # 1==1 条件成立,代码正常往下执行。
print(456)
优质内容筛选与推荐>>
1、Linux下 执行程序
2、Coins HDU - 2844 POJ - 1742
3、第一次解决Ubuntu的问题- 忘记用户名
4、<高性能JavaScript>笔记 [7~10]
5、FCKeditor


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn