Python中的异常处理raise案例介绍
目录
- 0. 介绍
- 1. raise 介绍(案例)
- 2. raise 不需要参数(案例)
- 3. raise:单独一个 raise(正常程序使用无参的 raise )
- 4. 其它案例
- 4.1 案例1
- 4.2 案例2
- 5. 处理流程
- 6. 显示error位置
- 总结
0. 介绍
问题1: 是否可以在程序的指定位置手动抛出一个异常
?
答案是肯定的,python 允许我们在程序中手动设置异常,使用 raise 语句
即可。
问题2: 我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢?
首先要分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用 raise 手动引发的异常(比如1÷0没有意义,程序没有写错,但是这样运算不合理,就是异常)。
raise 语句的android基本语法格式为:
raise [exceptionName [(reason)]]
其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述
。
如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。
也就是说,raise 语句有如下三种常用的用法:
- raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
- raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
- raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
代码测试
>>> raise Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> raise RuntimeError: No active exceptiomjtYyLdDnun to reraise
>>> raise ZeroDivisionError Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> raise ZeroDivisionError ZeroDivisionError
>>> raise ZeroDivisionError("除数不能为零") Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> raise ZeroDivisionError("除数不能为零") ZeroDivisionError: 除数不能为零
1. raise 介绍(案例)
程序正常运行的时候,根据需要,用 raise 手动引发异常。
raise 语句引发的异常,通常用 try except(else finally)异常处理结构来捕获并进行处理。例如:
try: a = input("输入一个数:") #判断用户输入的是否为数字 if(not a.isdigit()): raise ValueError("a 必须是数字") except ValueError as e: print("引发异常:", repr(e))
当我们输入字母 a ,程序运行结果为:
runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test') 输入一个数:>? a 引发异常: ValueError('a 必须是数字')
当我们输入数字 8,程序运行结果为:
输入一个数:8
由上面示例可以看出,我们手动让程序引发异常,很多时候并不是为了让其崩溃。
2. raise 不需要参数(案例)
这里重点关注位于 except 块中的 raise
try: a = input("输入一个数:") if(not a.isdigit()): raise ValueError("a 必须是数字") except ValueError as e: print("引发异常:", repr(e)) raise
由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。当我们输入字母 a ,程序执行结果为:
In[2]: runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test') 输入一个数:a 引发异常: ValueError('a 必须是数字',) Traceback (most recent call last): File "D:\python3.6\1.py", line 4, in <module> raise ValueError("a 必须是数字") ValueError: a 必须是数字
这里重点关注位于 except 块中的 raise,由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。
3. raise:单独一个 raise(正常程序使用无参的 raise )
当在没有引发过异常的程序使用无参的 raise 语句
时,它默认引发的是 RuntimeError 异常。例如:
try: a = input("输入一个数:") if(not a.isdigit()): raise except RuntimeError as e: print("引发异常:", repr(e))
当我们输入字母 a ,程序执行结果为:
In[3]: runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test') 输入一个数:>? a 引发异常: RuntimeError('No active exception to reraise')
4. 其它案例
4.1 案例1
def read_file(file, pattern): try: if file.endswith('rtd'): data = pd.read_csv(file, skiprows=41, sep=r'\t') elif file.endswith('csv'): data = pd.read_csv(file) else: 编程 raise ValueError("Unknown file type") data = extract_cols(data, pattern=pattern, file=file) except Exception as e: print(f"{os.path.basename(file).split('.')[0]}: {e}") data = pd.DataFrame() return data
4.2 案例2
def divide(a, b): return a/b try: divide(1, 0) except: print("divide by 0") else: print("the code is no problem") print("code after try catch,hello,world!")
输出结果
divide by 0
code after try catch,hello,world!
5. 处理流程
try: code #需要判python断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序 except: #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息 #except ExceptionName,args: #同时也可以接受异常名称和参数,针对不同形式的异常做处理 code #这里执行异常处理的相关代码,打印输出等 else: #如果没有异常则执行else code #try部分被正常执行后执行的代码 finally: code #退出try语句块总会执行的程序
可以看到,
- 这里的 else 是和 try-catch 连用的,并且 else 只在 try 中代码没有异常的情况下执行,else 必须在 except 这句代码存在的时候才能出现。
- finally 这个片段里面的代码是肯定在最后执行的,无论前面是否发生异常,最后总会执行finally片段内的代码。
- 所以,正常的流程是:try 没有发生错误-》else 内的代码-》finally 中的代码。
- 发生异常的流程是:try 中发生异常-》被 except 捕获并执行 except 片段中的代码-》执行 finally 中的代码。
6. 显示error位置
要在抛出异常时包含代码所在的位置,可以使用Python的traceback
模块。这个模块可以获取异常发生时的堆栈信息,包括文件名和行号。
以下是一个示例代码,展示了如何在捕获异常时打印出详细的错误信息,包括代码所在的位置:
import traceback try: # 假设这是可能会抛出异常的代码 # 例如:result = 10 / 0 # 这将引发ZeroDivisionError result = 10 / 0 except Exception as e: # 获取异常信息和堆栈跟踪 tb = traceback.format_exc() print(f"Error processing {filename}: {e}\nTraceback:\n{tb}")
在这个示例中,traceback.format_exc()
会返回一个字符串,其中包含了异常的详细信息和堆栈跟踪,包括引发异常的文件名和行号。这样,就可以清楚地看到错误发生的位置。
错误信息如下:
Error processing : division by zero
Traceback:Traceback (most recent call last): File "<ipython-input-5-6bef8f98af92>", line 6, in <module> result = 10 / 0ZeroDivisionError: division by zero
总结
也就是说,raise 语句有如下三种常用的用法:
1.raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
2.raise 异常类名称:raise 后带一个异常类名称,表示python引发执行类型的异常。3.raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
参考链接:
链接1、到此这篇关于Python中的异常处理raise案例介绍的文章就介绍到这了,更多相关python 异常处理raise内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论