什么时异常
java异常处理(较详细)
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的。比如: 客户输入数据的格式, 读取文件是否存在, 网络是否始终保持通畅等等。
异常: 将程序执行中发生的不正常情况称为“异常” 。
(开发过程中的语法错误和逻辑错误不是异常)
异常为什么需要处理
异常不处理就会终止程序的运行,而有的异常并不影响程序运行结果,由于这类异常造成终止运行非常不划算,所以可以由程序员在编写程序时, 就考虑到错误的检测、 错误消息的提示, 以及错误的处理。
异常处理简单示例
while True:
try:
sequence = input("请输入你的序号:")
i = int(sequence)
except Exception as e:
print(e)
i = 1
print(i)
"""
请输入你的序号:33
33
请输入你的序号:22
22
请输入你的序号:11
11
请输入你的序号:e
invalid literal for int() with base 10: 'e'
1
请输入你的序号:
"""
如上所示:整个小示例的逻辑就是让用户输入一段字段串,然后将输入的字符串强制成整型,如果是数字就可以转换成功没有异常,但是如果用户输入的是字母或者其它特殊字符,那么就会有异常。如果有异常就使用except抓住异常,如果成功抓住此异常,就能够定义如何处理。
这其实是一个固定格式写法
如果出错了,会创建一个Exception的对象,这个对象设置一个别名就是“e”,对象中封装了异常信息,可以拿出来异常信息。
异常的种类
每一种错误都有一种对象来表示错误的各类
Exception是最顶级的父类,其它的像indexError,ValueError这些都是Exception的子类
异常 | 解释 |
---|---|
AttributeError | 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x |
IOEorror | 输入/输出异常;基本上是无法打开文件 |
ImportError | 无法引入模块或包;基本上是路径问题或者名称错误 |
IndentationError | 语法错误(的子类);代码没有正确对齐 |
IndexError | 下标索引超过序列边界,比如当x只有三元素,却试图访问x[5] |
KeyError | 试图访问字典里不存在的键 |
KeyboardInterrupt | Ctrl+C被按下 |
NameError | 使用一个还未创建的对象的变量 |
SyntaxError | Python代码非法,就是语法错误 |
TypeError | 传入对象类型与要求的不符合 |
UnboundLocalError | 试图访问一个还未被设置的局部变量,基本上是由于另一个同名的全局变量,导致以为正在访问它 |
ValueError | 传入一个调用者不期望的值,即使值的类型是正确的。 |
其它还有很多异常类型,此处不在列举,常用的就是上面几个
异常处理进阶示例
while True:
try:
sequence = input("请输入你的序号:")
i = int(sequence)
except IndexError as e:
print("index error",e)
i = 1
except ValueError as e:
print("value error",e)
i = 1
except Exception as e:
print("Exception",e)
i = 1
else:
print("else")
finally:
print("finally")
如果没有任何异常,会执行“else”代码块中的内容
finally:不管有没有异常,最后一定会执行一遍的代码块
主动触发一个异常
try:
raise Exception("主动触发一个异常")
except Exception as e:
print(e)
"""
主动触发一个异常
"""
自定义异常类
class SelfDefineError(Exception):
def __init__(self,msg):
self.message = msg
def __str__(self):
return self.message
try:
raise SelfDefineError("自定义错误")
except SelfDefineError as e:
print(e)
"""
自定义错误
"""
自己写一个类,然后继承自Exception。也可以使用try来捕获异常。
“assert”断言(用于强制用户服从,不服从就报错,并且可捕获,但一般不捕获)
条件成立就不执行,条件不成立就抛异常
print("代码第一句")
assert 1 == 1
print("断言后代码")
"""
代码第一句
断言后代码
"""
1 确实等于1,所以两者条件成立,条件成立即可继续往下执行
print("代码第一句")
assert 1 == 2
print("断言后代码")
"""
代码第一句
Traceback (most recent call last):
File "E:/Python/Pycharm/Lab/week9/test.py", line 2, in <module>
assert 1 == 2
AssertionError
"""
1不行于2,所以条件不成立,所以抛了一个异常"AssertionError"
断言(assert)的目的就是,满足条件就让你用,不然直接抛异常,我这个程序必需满足什么条件,满足你可以使用,不满足你不可以使用。可以捕获异常,但是一般并不捕获