Python学习笔记——异常

1. 一个例子

file_name = input('请输入要打开的文件名:')
f = open(file_name)
print('文件的内容是:')
for each_line in f:
    print(each_line)

# 由于未输入文件后缀而报错
请输入要打开的文件名:girl_1
---------------------------------------------------------------------------

FileNotFoundError                         Traceback (most recent call last)

<ipython-input-1-92806aeac0ba> in <module>()
      1 file_name = input('请输入要打开的文件名:')
----> 2 f = open(file_name)
      3 print('文件的内容是:')
      4 for each_line in f:
      5     print(each_line)

FileNotFoundError: [Errno 2] No such file or directory: 'girl_1'

2. 异常种类

异常类型
以下是 Python 内置异常类的层次结构:
'''
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
      +-- StopIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning
'''

3. AssertionError

# python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。
my_list = ['小甲鱼是帅哥']
assert len(my_list) > 0
my_list.pop()
'小甲鱼是帅哥'
assert len(my_list) > 0
---------------------------------------------------------------------------

AssertionError                            Traceback (most recent call last)

<ipython-input-9-c183f6b56427> in <module>()
----> 1 assert len(my_list) > 0

AssertionError: 

4. AttributeError

# 访问未知的属性或方法
my_list.fishc
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-10-6cd380373ff6> in <module>()
----> 1 my_list.fishc

AttributeError: 'list' object has no attribute 'fishc'

5. IndexError

# 索引不存在
my_list = [1,2,3]
my_list[3]
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-12-630619d25352> in <module>()
      1 # 索引不存在
      2 my_list = [1,2,3]
----> 3 my_list[3]

IndexError: list index out of range

6.KeyError

# 关键字不存在
my_dict = {'one':1,'two':2,'three':3}
print(my_dict['one'])
print(my_dict['four'])
1
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-17-5fd29812ea8d> in <module>()
      2 my_dict = {'one':1,'two':2,'three':3}
      3 print(my_dict['one'])
----> 4 print(my_dict['four'])

KeyError: 'four'

7.NameError

# 访问一个不存在的变量
print(fishc)
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-16-cfe17886c343> in <module>()
      1 # 访问一个不存在的变量
----> 2 print(fishc)

NameError: name 'fishc' is not defined

8. OSError

# 如第一个例子FileNotFoundError就是它的子类

9. SyntaxError

# 语法错误
print 'I love you'
  File "<ipython-input-18-3552d36a503f>", line 2
    print 'I love you'
                     ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('I love you')?

10. TypeError

# 不同类型间的无效操作
print(1 + '1')
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-19-27cba25553e1> in <module>()
      1 # 不同类型间的无效操作
----> 2 print(1 + '1')
TypeError: unsupported operand type(s) for +: 'int' and 'str'

11. ZeroDivisionError

# 除数为0
print(5/0)

---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

<ipython-input-21-fb41e7d29eb0> in <module>()
      1 # 除数为0
----> 2 print(5/0)
ZeroDivisionError: division by zero

12. 异常检测——try-except

# 语法
'''
try:
    检测范围
except Exception[as reason]:
    出现异常(Exception)后的处理代码
'''

报错

ff = open('我为什么是一个文件.txt')
print(ff.read())
ff.close()
---------------------------------------------------------------------------

FileNotFoundError                         Traceback (most recent call last)

<ipython-input-22-a3241d9cac63> in <module>()
----> 1 ff = open('我为什么是一个文件.txt')
      2 print(ff.read())
      3 ff.close()

FileNotFoundError: [Errno 2] No such file or directory: '我为什么是一个文件.txt'

捕获异常并给出提示

try:
    ff = open('我为什么是一个文件.txt')
    print(ff.read())
    ff.close()
except OSError:
    print('文件出错啦!!')
文件出错啦!!

捕获异常并给出错误原因

try:
    ff = open('我为什么是一个文件.txt')
    print(ff.read())
    ff.close()
except OSError as reason:
    print('文件出错啦!!')
    print('错误的原因是:' + str(reason))
文件出错啦!!
错误的原因是:[Errno 2] No such file or directory: '我为什么是一个文件.txt'

有多个异常

# 只捕获第一个异常,因为程序运行到第一个异常就会停止运行
try:
    sum = 1 + '1'
    ff = open('我为什么是一个文件.txt')
    print(ff.read())
    ff.close()
except OSError as reason:
    print('文件出错啦!!')
    print('错误的原因是:' + str(reason))
except TypeError as reason:
    print('类型出错啦!!')
    print('错误的原因是:' + str(reason))
类型出错啦!!
错误的原因是:unsupported operand type(s) for +: 'int' and 'str'
# 若未捕获相应类型的异常,仍会报错
try:
    int('abc')
    sum = 1 + '1'
    ff = open('我为什么是一个文件.txt')
    print(ff.read())
    ff.close()
except OSError as reason:
    print('文件出错啦!!')
    print('错误的原因是:' + str(reason))
except TypeError as reason:
    print('类型出错啦!!')
    print('错误的原因是:' + str(reason))
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-28-23ae102eaf21> in <module>()
      1 # 若未捕获相应类型的异常,仍会报错
      2 try:
----> 3     int('abc')
      4     sum = 1 + '1'
      5     ff = open('我为什么是一个文件.txt')

ValueError: invalid literal for int() with base 10: 'abc'

无法确定确切的类型

# 可以直接给出提示
try:
    int('abc')
    sum = 1 + '1'
    ff = open('我为什么是一个文件.txt')
    print(ff.read())
    ff.close()
except:
    print('出错啦!')
出错啦!
# 也可以根据可能的类型来给出提示
try:
    sum = 1 + '1'
    ff = open('我为什么是一个文件.txt')
    print(ff.read())
    ff.close()
except (OSError,TypeError):
    print('出错啦!!')

13. 异常检测——try-finally

# 语法
'''
try:
    检测范围
except Exception [as reason]:
    出现异常(EXception)后的处理代码
finally:
    无论如何都会被执行的代码
'''
try:
    ff = open('我是一个文件.txt','w')
    print(ff.write('我存在了!'))
    sum = 1 + '1'
    ff.close()
except (OSError,TypeError):
    print('出错啦!!')

# 由于在创建这个文件之后出现了异常,而文件还未关闭,即文件未保存,则文件未写入任何东西
# 会打印出准备写入字符的个数
5
出错啦!!
try:
    ff = open('我是一个文件.txt','w')
    print(ff.write('我存在了!'))
    sum = 1 + '1'
except (OSError,TypeError):
    print('出错啦!!')
finally:
    # 这里写入关闭文件的操作,无论程序怎么报错,都会执行这里
    ff.close()
5
出错啦!!

总结:程序出现异常时,会先执行except里的语句,然后执行finally里的语句

14. 引出异常——raise

# 直接
raise
---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

<ipython-input-35-9c9a2cba73bf> in <module>()
----> 1 raise

RuntimeError: No active exception to reraise

raise ZeroDivisionError
---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

<ipython-input-36-c62fc6984c64> in <module>()
----> 1 raise ZeroDivisionError

ZeroDivisionError: 

raise ZeroDivisionError('除数为0的异常')
---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

<ipython-input-38-bec5ebf736a5> in <module>()
----> 1 raise ZeroDivisionError('除数为0的异常')

ZeroDivisionError: 除数为0的异常
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试pyth...
    _宁采臣阅读 1,022评论 0 10
  • 一、概要 ​ 一个程序即使没有任何语法错误,即使解题的逻辑也正确,在执行的时候仍然可能出现 各种“运行时错误”,导...
    唯老阅读 416评论 0 1
  • 57.异常处理 1)案例实践 >>> my_list=['xiaojiau'] >>> assert len(my...
    杨大菲阅读 319评论 0 0
  • 本文讲解了python标准异常、什么是异常、异常处理的多种方法和实例等内容,需要的朋友可以参考下 python提供...
    小白python教程阅读 1,250评论 0 2
  • 船歌鱼水饺,把饺子做成五颜六色的样子,用鱼肉等海鲜做馅儿。据说还登上了《舌尖上的中国》。这些都足以吸引我去尝试一下...
    心若繁语阅读 345评论 0 0