当前位置:   article > 正文

Python 异常处理_python异常处理语句

python异常处理语句

 一、异常

      对于异常,大家都不陌生,也不怕大家笑话,我刚接触编程的时候我在控制台打印一个"hello world"都报了异常。 

对于常见的错误,见下表:

1.常见的异常

异常解释
AttributeError    访问的对象属性不存在

ImportError    

无法导入模块或者对象,主要是路径有误或名称错误  

IndentationError

代码没有正确对齐,主要是缩进错误

IndexError    

下标索引超出序列范围

IOError        

输入/输出异常,主要是无法打开文件

KeyError    

访问字典里不存在的键

NameError    

访问一个未声明的变量

OverflowError  

 数值运算超出最大限制

SyntaxError  

 python语法错误

TabError    

Tab和空格混用

TypeError    

不同类型数据之间的无效操作(传入对象类型与要求的不符合)

ValueError    

传入无效的值,即使值的类型是正确的

ZeroDivisionError  

除法运算中除数0 或者 取模运算中模数为0

2.异常举例

1. SyntaxError

         输出helloworld错误主要是因为使用的是中文状态下的双引号

  1. print("hello world!")
  2. print(“hello world!”)

        这时候使用中文状态下双引号的print函数会报python语法错误,在进行编写代码的时候要注意使用的是英文状态下的字符。

print("hello world!") 

SyntaxError: invalid character in identifier

2. ZeroDivisionError

        对于ZeroDivisionError,常见于计算中,如:

  1. a = 1/0
  2. print(a)

         在数学计算中,0是不能作为被除数参与运算的

ZeroDivisionError: division by zero

3.TypeError

  1. x = 520 + "Messi"
  2. print(x)

        对于数字类型和字符类型的数据是不能加在一起的 

TypeError: unsupported operand type(s) for +: 'int' and 'str'

二、异常的处理

 1.try - except

        对于异常,大家都不想遇见,如何在程序出错之前就找到异常,在代码中捕获并且处理异常呢,这里我们用到try - except语句。

        当try中的代码块没有出错时,会继续执行try中的代码,在出现异常的时候,会执行except中的代码。

  1. try:
  2. 1/1 #检测范围
  3. print("程序正常")
  4. except: #[expression[as identifer]]
  5. print("出错了。。") #异常处理代码
  6. try:
  7. 1/0
  8. print("程序正常")
  9. except:
  10. print("出错了。。")

程序正常
出错了。。

2. 异常指定

1.单异常

        在except后面指定异常的时候,如果指定的异常和try代码块中的异常不一样的话,不会执行except中的代码,会继续报错。

  1. try:
  2. 1/0 #异常和except中定义的一样
  3. print("程序正常")
  4. except ZeroDivisionError as e:
  5. print("出错了。。",e)
  6. try:
  7. 1/0 #异常和except中定义的不一样
  8. print("程序正常")
  9. except TypeError as e:
  10. print("出错了。。",e)
  11. #可以通过as e 打印出来具体异常

出错了。。 division by zero

ZeroDivisionError: division by zero

2.多异常

        可以再expect后面写入多个异常类型,当try代码块中的异常属于其中一个的时候,就会直接执行except中的内容。

  1. #写法一
  2. try:
  3. 1/0
  4. 520 +"messi"
  5. except (ZeroDivisionError,TypeError,SyntaxError):
  6. print("出错了。。")
  7. #写法二
  8. try:
  9. 1/0
  10. 520 +"messi"
  11. except ZeroDivisionError:
  12. print("ZeroDivisionError")
  13. except SyntaxError:
  14. print("SyntaxError")
  15. except TypeError:
  16. print("TypeError")

出错了。。
ZeroDivisionError

        我们发现写法一中的两个异常都被捕获了,而写法二中的异常在捕获了ZeroDivisionError的异常后就直接执行except中的代码,而忽略了对 520 +"messi" 异常的执行。

3.异常搭配语句

1. try - except - else

        当我们的代码没有问题的时候,就会执行else中的代码

  1. #例1
  2. try:
  3. 1/1
  4. except :
  5. print("出错了。。")
  6. else:
  7. print("没出错!!")
  8. #例2
  9. try:
  10. 1/1
  11. except :
  12. print("出错了。。")
  13. else:
  14. print("没出错!!")

没出错!!
出错了。。

2. try - except - finally

        无论代码有没有出现错误,都会执行finally中的代码,常用于放置一个程序必须要运行的代码,列如文件的关闭,资源的释放等。

  1. try:
  2. 1/1
  3. except :
  4. print("出错了。。")
  5. else:
  6. print("没出错!!")
  7. finally:
  8. print("有没有错都执行我!!!")
  9. try:
  10. 1/0
  11. except :
  12. print("出错了。。")
  13. else:
  14. print("没出错!!")
  15. finally:
  16. print("有没有错都执行我!!!")

运行结果为: 

 没出错!!
有没有错都执行我!!!
出错了。。
有没有错都执行我!!!

4.异常的嵌套

  1. #先内部异常,然后外部异常
  2. try:
  3. try:
  4. 520 + "Messi"
  5. except:
  6. print("内部异常!")
  7. 1/0
  8. except:
  9. print("外部异常!")
  10. finally:
  11. print("结束")
  12. #先外部异常,然后内部异常
  13. try:
  14. 1/0
  15. try:
  16. 520 + "Messi"
  17. except:
  18. print("内部异常!")
  19. except:
  20. print("外部异常!")
  21. finally:
  22. print("结束")

        当先外部异常的时候,不会执行内部代码,当先内部异常的时候,会执行外部代码。

内部异常!
外部异常!
结束
外部异常!
结束

5.raise和assert

1.raise

        可以触发异常,用于直接抛出Python内置异常,或用户自定义的异常。

  1. #定义已有异常的提示
  2. raise ZeroDivisionError("除数不能为0")
  3. try:
  4. 1/0
  5. except:
  6. raise ZeroDivisionError("不能这样写啊!")
  7. #自定义异常
  8. raise ZiDingYi("我是自定义异常!")
  9. #异常链,表明异常来自于那里
  10. raise ValueError("除数不能为0") from ZeroDivisionError

>>>Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError("除数不能为0")
ZeroDivisionError: 除数不能为0


>>> raise ZiDingYi("我是自定义异常!")
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise ZiDingYi("我是自定义异常!")
NameError: name 'ZiDingYi' is not defined


>>> try:
   1/0
except:
   raise ZeroDivisionError("不能这样写啊!")

Traceback (most recent call last):
  File "<pyshell#3>", line 2, in <module>
    1/0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#3>", line 4, in <module>
    raise ZeroDivisionError("不能这样写啊!")
ZeroDivisionError: 不能这样写啊!


>>> raise ValueError("除数不能为0") from ZeroDivisionError
ZeroDivisionError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    raise ValueError("除数不能为0") from ZeroDivisionError
ValueError: 除数不能为0
 

2. assert

        assert只能引发AssertionError异常,通常用于判断,类似于if语句。

  1. a = "Messi"
  2. assert a == "Messi"
  3. assert a != "Messi"

        当结果为true时什么都不会发生,当结果时false时,会报出错误。

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    assert a != "Messi"
AssertionError

        以上内容就是异常的相关知识了,欢迎补充!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/209307
推荐阅读
相关标签
  

闽ICP备14008679号