异常处理

Posted 不会起名字

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。

什么是异常?

异常发生之后在他后面的代码就不执行了。


 

为什么要进行异常处理?

不处理你的程序还怎么运行?


 

异常处理的方法:

1,使用if判断语句

技术分享
1 num1=input(>>: ) #输入一个字符串试试
2 int(num1)
正常的代码
技术分享
 1 num1=input(>>: ) #输入一个字符串试试
 2 if num1.isdigit():
 3     int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
 4 elif num1.isspace():
 5     print(输入的是空格,就执行我这里的逻辑)
 6 elif len(num1) == 0:
 7     print(输入的是空,就执行我这里的逻辑)
 8 else:
 9     print(其他情情况,执行我这里的逻辑)
10 
11 ‘‘‘
12 问题一:
13 使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂
14 问题二:
15 这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
16 ‘‘‘
使用if进行异常处理

总结:

1、if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要重复的if来进行处理。

2、在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差

3、if是可以解决异常的,只是存在1、2的问题,所以,千万不要妄下定论if不能用来异常处理

技术分享
1 def test():
2     print(test running)
3 choice_dic={
4     1:test
5 }
6 while True:
7     choice=input(>>: ).strip()
8     if not choice or choice not in choice_dic:continue #这便是一种异常处理机制啊
9     choice_dic[choice]()
例子

Python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

基本语法:

try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
技术分享
1 f = open(a.txt)
2 g = (line.strip() for line in f)
3 for line in g:
4     print(line)
5 else:
6     f.close()
before
技术分享
 1 try:
 2     f = open(a.txt)
 3     g = (line.strip() for line in f)
 4     print(next(g))
 5     print(next(g))
 6     print(next(g))
 7     print(next(g))
 8     print(next(g))
 9 except StopIteration:
10     f.close()
11 ‘‘‘
12 next(g)会触发迭代f,依次next(g)就可以读取文件的一行行内容,无论文件a.txt有多大,同一时刻内存中只有一行内容。
13 提示:g是基于文件句柄f而存在的,因而只能在next(g)抛出异常StopIteration后才可以执行f.close()
14 ‘‘‘
after

异常类智能用来处理指定的异常情况,如果非指定类则无法处理,报错

技术分享
1 s1 = hello
2 try:
3     int(s1)
4 except IndexError as e:
5     print(e)
6 ‘‘‘ValueError写为IndexError,错误‘‘‘
上边的

多分枝:一个try里可以有多个except;

万能异常:Exception-----------可以捕获任意异常

try......except 中的else语句,在try代码块内没有异常则执行

finally 语句,无论有没有异常都执行

技术分享
1 #主动触发异常
2 try:
3     raise TypeError(类型错误)
4 except Exception as e:
5     print(e)
异常触发
技术分享
 1 #自定义异常
 2 class EvaException(BaseException):
 3     def __init__(self,msg):
 4         self.msg=msg
 5     def __str__(self):
 6         return self.msg
 7 try:
 8     raise EvaException(类型错误)
 9 except EvaException as e:
10     print(e)
自定义异常

断言(assert)+判断,正确执行下边的,错误从该位置终止程序。


 

 

 

以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章

使用片段中的处理程序时出现非法状态异常

Java异常处理机制

java 反射代码片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

片段中的Android致命异常