本文是python异常的基础知识,欢迎阅读,一起进步
Python专栏请参考
:人生苦短-我学pythonprint ('-----test--1---')
open('123.txt', 'r')
print ('-----test--2---')
-----test--1---
Traceback (most recent call last):
File "D:/Phython/study/venv/Include/hello.py", line 2, in <module>
open('123.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
Why?-->
打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的文件或目录)try:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
except IOError:
pass
-----test--1---
try:
print (num)
except IOError:
print('产生错误了')
Traceback (most recent call last):
File "D:/Phython/study/venv/Include/hello.py", line 2, in <module>
print (num)
NameError: name 'num' is not defined
上例程序,已经使用except来捕获异常了,为什么还会看到错误的信息提示?
正确写法
try:
print num
except NameError:
print('产生错误了')
产生错误了
#coding=utf-8
try:
print('-----test--1---')
open('123.txt','r') # 如果123.txt文件不存在,那么会产生 IOError 异常
print('-----test--2---')
print(num)# 如果num变量没有定义,那么会产生 NameError 异常
except (IOError,NameError):
#如果想通过一次except捕获到多个异常可以用一个元组的方式
print("捕捉到异常")
-----test--1---
捕捉到异常
换个顺序对比一下
#coding=utf-8
try:
print(num)# 如果num变量没有定义,那么会产生 NameError 异常
print('-----test--1---')
open('123.txt','r') # 如果123.txt文件不存在,那么会产生 IOError 异常
print('-----test--2---')
except (IOError,NameError):
#如果想通过一次except捕获到多个异常可以用一个元组的方式
print("捕捉到异常")
捕捉到异常
try:
num = 100
print(num)
except NameError as errorMsg:
print('产生错误了:%s'%errorMsg)
else:
print('没有捕获到异常,真高兴')
100
没有捕获到异常,真高兴
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
#如果在读取文件的过程中,产生了异常,那么就会捕获到
#比如 按下了 ctrl+c
print("捕捉到异常")
finally:
f.close()
print('关闭文件')
except:
print("没有这个文件")
没有这个文件
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
finally:
f.close()
print('关闭文件')
except:
print("没有这个文件")
def test1():
print("----test1-1----")
print(num)
print("----test1-2----")
def test2():
print("----test2-1----")
test1()
print("----test2-2----")
def test3():
try:
print("----test3-1----")
test1()
print("----test3-2----")
except Exception as result:
print("捕获到了异常,信息是:%s" % result)
print("----test3-2----")
test3()
print("------华丽的分割线-----")
test2()
----test3-1----
----test1-1----
捕获到了异常,信息是:name 'num' is not defined
----test3-2----
------华丽的分割线-----
----test2-1----
----test1-1----
Traceback (most recent call last):
File "D:/Phython/study/venv/Include/hello.py", line 26, in <module>
test2()
File "D:/Phython/study/venv/Include/hello.py", line 9, in test2
test1()
File "D:/Phython/study/venv/Include/hello.py", line 3, in test1
print(num)
NameError: name 'num' is not defined
下面是一个引发异常的例子:
class ShortInputException(Exception):
'''自定义的异常类'''
def __init__(self, length, atleast):
#super().__init__()
self.length = length
self.atleast = atleast
def main():
try:
s = input('请输入 --> ')
if len(s) < 3:
# raise引发一个你定义的异常
raise ShortInputException(len(s), 3)
except ShortInputException as result:#x这个变量被绑定到了错误的实例
print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))
else:
print('没有异常发生.')
main()
情况1
请输入 --> hello
没有异常发生.
情况2
请输入 --> la
ShortInputException: 输入的长度是 2,长度至少应是 3
那么在Python中,如果要引用一些其他的函数,该怎么处理呢?
模块就好比是工具包
,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块import module1,mudule2...
模块名.函数名
什么必须加上模块名调用呢 ?
import math
#这样会报错
print sqrt(2)
#这样才能正确输出结果
print math.sqrt(2)
from 模块名 import 函数名1,函数名2....
from math import *
来实现from modname import name1[, name2[, ... nameN]]
from fib import fibonacci
from … import *
from modname import *
import time as tt
time.sleep(1)
Traceback (most recent call last):
File "D:/Phython/study/venv/Include/hello.py", line 2, in <module>
time.sleep(1)
NameError: name 'time' is not defined
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
test.py
def add(a, b):
return a + b
main.py
import test
result = test.add(11, 22)
print(result)
test.py
def add(a, b):
return a + b
# 用来进行测试
ret = add(12, 22)
print('int test.py file,,,,12+22=%d' % ret)
int test.py file,,,,12+22=34
import test
result = test.add(11, 22)
print(result)
int test.py file,,,,12+22=34
33
__init__.py 控制着包的导入行为
异常 | 解释 |
---|---|
AttributeError | 当你访问一个对象的属性,但是这个属性并没有在这个对象定义的时候,就会引发 AttributeError |
ImportError | 在使用 import 导入模块时,如果要导入的模块找不到,或者从模块中导入模块中不存在的内容 |
IndexError | 当你尝试从序列(如列表或元组)中检索索引,但是序列中找不到该索引。此时就会引发 IndexError |
KeyError | 与 IndexError 类似,当你访问映射(通常是 dict )中不包含的键时,就会引发 KeyError。 |
NameError | 当你引用了变量、模块、类、函数或代码中没有定义的其他名称时,将引发 NameError。 |
SyntaxError | 当代码中有不正确的 Python 语法时,就会引发 SyntaxError。下面的问题是函数定义行末尾缺少一个冒号 |
TypeError | 当你的代码试图对一个无法执行此操作的对象执行某些操作时,例如将字符串添加到整数中,以及一开始的例子使用 append 方法给元组添加元素,这些都会引发 TypeError。 |
ValueError | 当对象的值不正确时就会引发 ValueError。这个和我们前面说的因为索引的值不在序列的范围内,而导致 IndexError 异常类似。 |
The best investment is in yourself
2020.04.06 记录辰兮的第49篇博客