-
Python异常
2015-12-09 14:04:24异常的处理 异常是指程序中的例外,违例情况; 在Python3中,BaseException是所以异常的基类,所以的内置异常都是它的派生类;...Python内的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获子类异常的处理
异常是指程序中的例外,违例情况;在Python3中,BaseException是所以异常的基类,所以的内置异常都是它的派生类;Exception是除了SystemExit,GeneratorExit和KeyboardInterrupt之外的所有内置异常的基类,用户自定义的异常也要继承它;Python内的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获子类异常;*StopItertion 当迭代器中没有数据项时触发,由内置函数next()和迭代器的__next__()方法触发*ArithmeticError 算法异常基类,包括OverflowError(溢出异常),ZeroDivisionError(零除异常),FloatingPointError(失败的浮点数操作)*AssertionError assert语句失败时触发*AttributeError 属性引用和属性赋值异常*BufferError 缓存异常,当一个缓存相关的操作不能进行时触发*EOFError 未见末尾,使用内置函数input()生成,标识到达文件末尾。但是如read()和readline()等大多数I/O操作将返回一个空字符串来表示EOF而不是引发异常*ImportError 导入异常,当import语句或者from语句无法在模块中找到相应文件名称时触发*LookupError 当使用映射或者序列时,如果键值或者索引无法找到的时候触发——(KeyError和IndexError的基类)*MemoryError 内存错误,当操作超出内存范围时触发*NameError 名称异常,在局部或者全局空间中无法找到文件名称时触发*OSError 当一个系统函数返回一个系统相关的错误时触发*ReferenceError 引用异常,当底层的对象呗销毁后访问弱引用是触发*RuntimeError 包含其他分类中没有被包括进去的一般错误*SyntaxError 语法错误*SystemError 编译器的内部错误*TypeError 类型异常,当操作或者函数应用到不合适的类型时触发*ValueError 值异常,当操作或者函数的类型正确,但是值不正确时触发*Warning 警告try...except
try...except语句用于处理问题语句,捕获可能出现的异常;try子句中的代码块放置可能出现异常的语句,except子句中的代码块处理异常;当异常出现时,python会自动生成1个异常对象,包含异常的具体信息;如:open("hello.txt","r") Traceback (most recent call last): File "C:\Users\cs\Desktop\hello.py", line 1, in <module> open("hello.txt","r") FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt'
使用try...except语句:try: open("hello.txt","r") #尝试读取一个不存在的文件,如果出现异常直接跳入except print("读文件") except FileNotFoundError: #捕捉FileNotFoundError异常 print("文件不存在") except: #其他异常情况 print("程序异常") 输出结果: 文件不存在
try: result = 10/0 except ZeroDivisionError: print("0不能被整除") else: print(result) #如果result表达式为10/2,则异常不会发生,else子句将被执行
异常嵌套:
如果外层try子句中的代码块引发异常,程序直接跳转到外层对应的except子句try: s = "hello" try: print(s[0] + s[1]) print(s[0] - s[1]) except TypeError: print("字符串不支持减法运算") except: print("异常") 输出结果: he 字符串不支持减法运算
try...except嵌套语句通常用于释放已经创建的系统资源try...finally
无论异常是否发生,finally子句都会被执行;所有finally子句通常用于关闭因异常而不能释放的系统资源;try中的变量是局部变量;try: f = open("hello.txt","r") try: print(f.read(5)) except: print("读取文件错误") finally: print("释放资源") f.close() except FileNotFoundError: print("文件不存在") 输出结果: 文件不存在
使用raise抛出异常
raise可以显示引发异常,一旦执行了raise语句,raise后面的代码将不能被执行;raise语句通常用于抛出自定义异常,因其不再python的控制范围内,不会被python自动抛出try: s = None if s is None: print("s是空对象") raise NameError print(len(s)) except TypeError: print("空对象没有长度") 输出结果: s是空对象 Traceback (most recent call last): File "C:\Users\cs\Desktop\hello.py", line 5, in <module> raise NameError NameError
自定义异常
Python运行程序媛自定义异常类型,用于描述Python异常体系中没有涉及的异常情况;自定义异常必须继承Exception类,按照命名规范以Error结尾,显示告诉程序媛该类是异常类;自定义异常使用raise语句引发from __future__ import division class DivisionException(Exception): def __init__(self,x,y): Exception.__init__(self,x,y) self.x = x self.y = y if __name__ == "__main__": try: x = 3 y = 2 if x%y > 0: print(x/y) raise DivisionException(x,y) #注释此行DivisionException异常不会触发 except DivisionException.div: #div表示DivisionException类的实例对象 print("DivisionException:x/y = %.2f"%(div.x/div.y)) 输出结果: 1.5 Traceback (most recent call last): File "C:\Users\cs\Desktop\hello.py", line 15, in <module> raise DivisionException(x,y) #注释此行DivisionException异常不会触发 DivisionException: (3, 2) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\cs\Desktop\hello.py", line 16, in <module> except DivisionException.div: #div表示DivisionException类的实例对象 AttributeError: type object 'DivisionException' has no attribute 'div'
assert语句
assert语句用于检测某个表达式是否为真;又称断言语言,即assert认为检测的表达式永远为真;t = ("hello",) assert len(t) >= 1 t = ("hello") assert len(t) ==1 输出结果: Traceback (most recent call last): File "C:\Users\cs\Desktop\hello.py", line 4, in <module> assert len(t) ==1 AssertionError
-
Python 异常
2013-03-15 16:42:32当你的程序中出现某些 异常的 状况的时候,异常就发生了。例如,当你想要读某个文件的时候,而那个文件不存在。或者在程序运行的时候,你不小心把它删除了。上述这些情况可以使用异常来处理。 假如你的程序中有一些...当你的程序中出现某些 异常的 状况的时候,异常就发生了。例如,当你想要读某个文件的时候,而那个文件不存在。或者在程序运行的时候,你不小心把它删除了。上述这些情况可以使用异常来处理。
假如你的程序中有一些无效的语句,会怎么样呢?Python会引发并告诉你那里有一个错误,从而处理这样的情况。
错误
考虑一个简单的
print
语句。假如我们把print
误拼为Print
,注意大写,这样Python会 引发 一个语法错误。>>> Print 'Hello World'
File "<stdin>", line 1
Print 'Hello World'
^
SyntaxError: invalid syntax
>>> print 'Hello World'
Hello World我们可以观察到有一个
SyntaxError
被引发,并且检测到的错误位置也被打印了出来。这是这个错误的 错误处理器 所做的工作。try..except
我们尝试读取用户的一段输入。按Ctrl-d,看一下会发生什么。
>>> s = raw_input('Enter something --> ')
Enter something --> Traceback (most recent call last):
File "<stdin>", line 1, in ?
EOFErrorPython引发了一个称为
EOFError
的错误,这个错误基本上意味着它发现一个不期望的 文件尾 (由Ctrl-d表示)接下来,我们将学习如何处理这样的错误。
处理异常
我们可以使用
try..except
语句来处理异常。我们把通常的语句放在try-块中,而把我们的错误处理语句放在except-块中。#!/usr/bin/python
# Filename: try_except.pyimport
sys
try
:
s =
raw_input
(
'Enter something --> '
)
except
EOFError:
print
'\nWhy did you do an EOF on me?'
sys
.exit()
# exit the program
except
:
print
'\nSome error/exception occurred.'
# here, we are not exiting the program
print
'Done'
(源文件:code/try_except.py)
输出
$ python try_except.py
Enter something -->
Why did you do an EOF on me?
$ python try_except.py
Enter something --> Python is exceptional!
Done它如何工作
我们把所有可能引发错误的语句放在
try
块中,然后在except
从句/块中处理所有的错误和异常。except
从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误/异常。如果没有给出错误或异常的名称,它会处理 所有的 错误和异常。对于每个try
从句,至少都有一个相关联的except
从句。如果某个错误或异常没有被处理,默认的Python处理器就会被调用。它会终止程序的运行,并且打印一个消息,我们已经看到了这样的处理。
你还可以让
try..catch
块关联上一个else
从句。当没有异常发生的时候,else
从句将被执行。我们还可以得到异常对象,从而获取更多有个这个异常的信息。这会在下一个例子中说明。
引发异常
你可以使用
raise
语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error
或Exception
类的直接或间接导出类。如何引发异常
#!/usr/bin/python
# Filename: raising.pyclass
ShortInputException
(Exception):
'''A user-defined exception class.'''
def
__init__
(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleasttry
:
s =raw_input
(
'Enter something --> '
)
if
len
(s) <
3
:
raise ShortInputException(len
(s),
3
)
# Other work can continue as usual here
except
EOFError:
print
'\nWhy did you do an EOF on me?'
except
ShortInputException, x:
print
'ShortInputException: The input was of length %d, \
was expecting at least %d'% (x.length, x.atleast)
else
:
print
'No exception was raised.'
源文件(code/raising.py)
输出
$ python raising.py
Enter something -->
Why did you do an EOF on me?
$ python raising.py
Enter something --> ab
ShortInputException: The input was of length 2, was expecting at least 3
$ python raising.py
Enter something --> abc
No exception was raised.它如何工作
这里,我们创建了我们自己的异常类型,其实我们可以使用任何预定义的异常/错误。这个新的异常类型是
ShortInputException
类。它有两个域——length
是给定输入的长度,atleast
则是程序期望的最小长度。在
except
从句中,我们提供了错误类和用来表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。在这个特别的except
从句中,我们使用异常对象的length
和atleast
域来为用户打印一个恰当的消息。try..finally
假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用
finally
块来完成。注意,在一个try
块下,你可以同时使用except
从句和finally
块。如果你要同时使用它们的话,需要把一个嵌入另外一个。使用finally
#!/usr/bin/python
# Filename: finally.pyimport
time
try
:
f =file
(
'poem.txt'
)
while
True
:
# our usual file-reading idiom
line = f.readline()
if
len
(line) ==
0
:
break
time
.sleep(
2
)
print
line,
finally
:
f.close()print
'Cleaning up...closed the file'
(源文件:code/finally.py)
输出
$ python finally.py
Programming is fun
When the work is done
Cleaning up...closed the file
Traceback (most recent call last):
File "finally.py", line 12, in ?
time.sleep(2)
KeyboardInterrupt它如何工作
我们进行通常的读文件工作,但是我有意在每打印一行之前用
time.sleep
方法暂停2秒钟。这样做的原因是让程序运行得慢一些(Python由于其本质通常运行得很快)。在程序运行的时候,按Ctrl-c中断/取消程序。我们可以观察到
KeyboardInterrupt
异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭概括
我们已经讨论了
try..except
和try..finally
语句的用法。我们还学习了如何创建我们自己的异常类型和如何引发异常。接下来,我们将探索Python标准库。
注:本书是《Python简明教程》
-
python异常处理
2020-07-13 04:20:08try方法实现python异常处理方式一
try: #运行可能产生异常的代码 except: #如果try后面的代码运行错误则运行这部分代码
方式二
try: #运行可能产生异常的代码 except: #如果try后面的代码运行错误则运行这部分代码 else: #如果没有异常发生
没有异常处理的程序
以爬取王者荣耀图片为例子
import urllib.request import os # http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/191/191-bigskin-1.jpg 王者荣耀图床地址 文件夹191~529 -1表示皮肤 ,之后是-2 、-3... for num in range(105,600): # try: path = r'D:\文档\code\web前端\王者荣耀图库\皮肤\ ' # os.mkdir(path + str(num)) #创建文件夹 response = urllib.request.urlopen("http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/"+str(num)+"/"+str(num)+"-bigskin-1"+".jpg") #图片地址 print(response) wangzhe_img = response.read() with open('D:\文档\code\web前端\王者荣耀图库\皮肤\ '+ str(num) + '.jpg','wb') as f: f.write(wangzhe_img) # except: # continue
有异常处理的程序
按照上述方式爬取图片,会遇到当网址无法打开则无法进行下一步的问题(王者荣耀图片网站并不是191~529都有图片,有些英雄之间的编号可能有间隔,因而运行程序遇到这种情况会出现error)
为解决该问题,使用try异常处理,当遇到无法打开的网址时,直接跳过继续循环的下一个步骤,如:
import urllib.request import os # http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/191/191-bigskin-1.jpg 王者荣耀图床地址 文件夹191~529 -1表示皮肤 ,之后是-2 、-3... for num in range(105,600): try: path = r'D:\文档\code\web前端\王者荣耀图库\皮肤\ ' # os.mkdir(path + str(num)) #创建文件夹 response = urllib.request.urlopen("http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/"+str(num)+"/"+str(num)+"-bigskin-1"+".jpg") #图片地址 print(response) wangzhe_img = response.read() with open('D:\文档\code\web前端\王者荣耀图库\皮肤\ '+ str(num) + '.jpg','wb') as f: f.write(wangzhe_img) except: continue
-
python 异常
2013-07-16 16:26:15第一:基于类的异常 class General: pass class Specific(General): pass raise Specific()自定义异常类最好继承Exception内置异常类,但这并不是必须的。继承内置异常类,可以让自定义异常类获得一些 免费的有用...第一:基于类的异常
自定义异常类最好继承Exception内置异常类,但这并不是必须的。继承内置异常类,可以让自定义异常类获得一些class General: pass class Specific(General): pass raise Specific()
免费的有用的接口和工具。
class MyException(Exception): pass class Specific(MyException): pass
第二:定义异常文本
输出:class MyException: pass raise MyException
显示并不是很友好,可以自定义显示信息。File "test.py", line 4, in <module> raise MyException __main__.MyException: <__main__.MyException instance at 0x7f1d90714638>
输出:class MyException: def __str__(self): return "my-fault" raise MyException
通过__str__可以实现自定义异常文本File "test.py", line 5, in <module> raise MyException __main__.MyException: my-fault
如果继承于内置异常类Exception,则构造方法的参数会自动存储并显示在异常消息中。
输出:class MyException(Exception): pass raise MyException('a', 'b')
同样,如果不喜欢这个默认输出信息,可以重新__str__方法来实现自定义显示。Traceback (most recent call last): File "test.py", line 4, in <module> raise MyException('a', 'b') __main__.MyException: ('a', 'b')
第三:发送额外数据
class MyException(Exception): def __init__(self, file): self.file = file def catcher(): try: raise MyException("my-file") except MyException, X: print X.file catcher()
-
Python异常 TypeError
2019-03-20 19:32:36Python异常 TypeError抛出场景和规避方法介绍。 -
Python异常处理
2017-11-04 16:45:31Python异常处理 -
Python 异常处理
2021-01-15 15:01:37Python异常处理 在Python中存在着两种错误:语法错误、逻辑错误 语法错误在写程序的必不能犯的。因为只要写出了语法错误,整个程序就无法运行。这Python的规定 而逻辑错误,则是我们平常编写代码的过程中产生的,... -
Python异常习题
2016-07-29 08:28:28Python异常习题 -
Python异常处理 -跳过异常继续执行
2019-02-19 15:01:48Python异常处理 -跳过异常继续执行 python一般使用try…except…处理异常 try: #可能会出现异常的代码,放在try下 code1 #如何try内部任意一行代码出现异常,# 直接跳转至except,执行except下代码 code2 except: ... -
python异常 详解
2016-10-27 10:45:26python异常处理 自定义异常 手动触发异常 -
2.2 Python异常处理
2019-05-21 10:38:502.2 Python异常处理 2.2.1 异常介绍: 即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: &... -
python异常处理&异常基类学习
2019-10-24 16:22:07python异常处理&异常基类学习 -
Python异常处理和C++异常处理
2019-07-31 10:48:36Python异常处理和C++异常处理 Python异常处理 什么是异常? 异常即一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 一般情况下,在Python无法正常处理程序时就会发生一个异常。 异常是Python对象,... -
Python异常处理和异常类型
2015-09-21 18:58:26Python异常处理和异常类型目录 Python异常处理和异常类型 目录 python2x捕获异常语法 python3x捕获异常语法 python常见的异常类型 NameError尝试访问一个未申明的变量 ZeroDivisionError除数为0 SyntaxError语法错误... -
python异常打印堆栈
2020-07-20 19:17:501 python异常打印堆栈 python调试中难免要捕获异常,并捕捉异常信息,使用 print(e) ,无法得到调用堆栈,不利于问题定位,这里列出python的异常打印方法,记住方便后续调试问题。 import traceback def fun(a,b): ... -
Python异常处理机制
2017-02-28 21:43:21Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 异常处理 断言(Assertions) python标准异常 异常名称 描述 ... -
Python异常捕获及自定义异常类
2019-05-14 00:00:45Python异常捕获及自定义异常类 一、什么是异常? 异常是一个与业务逻辑无关的BUG,一个潜在错误或者网络错误事件等,如:尚未实现的函数,缩进错误,Python语法错误等.该事件可能会在程序执行过程中发生,影响程序的... -
Python 初学者必看:Python 异常处理集合
2021-03-15 15:13:43摘要:作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,本文专门介绍 python 异常处理。 异常 广义上的错误分为错误和异常 错误指的是可以人为避免 异常是指在语法逻辑正确的而前提下,... -
Python异常 ValueError
2019-03-04 17:08:57Python ValueError异常抛出场景和规避方法介绍。 -
Python异常处理(基础详解)
2020-04-06 13:52:05本文是python异常的基础知识,欢迎阅读,一起进步 Python专栏请参考:人生苦短-我学python 文章目录一.异常简介二.捕获异常三.异常的传递四.抛出自定义的异常五.模块六.模块制作七.python中的包 一.异常简介 ... -
Python异常处理总结
2015-01-13 22:47:28Python异常处理总结 这篇文章主要介绍了Python异常处理总结,需要的朋友可以参考下 本文较为详细的罗列了Python常见的异常处理,供大家参考,具体如下: 1. 抛出异常和自定义异常 Python用异常对象(exception... -
Python异常的处理和检测
2020-08-31 17:38:17Python异常的处理和检测 捕获异常 在Python程序执行过程中发生的异常可以通过try语句来检测,可以把需要检测的语句放置在try块里面,try块里面的语句发生的异常都会被try语句检测到,并抛出异常给Python解释器,... -
python异常处理中不会用到的关键字是_python异常处理(一)
2020-12-02 13:41:41Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。Python... -
Python异常编码处理
2017-10-31 00:12:34Python异常编码处理1.主动触发异常 raiseraise TypeError raise TypeError,'Error Message' #添加错误提示 asserta = 1 assert a > 0 assert a > 0,"a must lg 0" #添加错误提示 2.处理特定异常 try/excepttry: int... -
Python异常继承关系和自定义异常实现代码实例
2020-03-24 21:59:56这篇文章主要介绍了Python异常继承关系和自定义异常实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要介绍 python 中异常的继承关系,及如何...