python try except finally raise

本文详细介绍了Python中的异常处理机制,包括try-except-else-finally结构的使用方法、异常的捕获与处理流程、如何利用raise传递异常以及如何指定捕获特定类型的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

稍微总结一下,否则总是忘。

[python]  view plain copy print ?
  1. x = 'abc'  
  2. def fetcher(obj, index):  
  3.     return obj[index]  
  4.   
  5. fetcher(x, 4)  

输出:

[plain]  view plain copy print ?
  1.   File "test.py", line 6, in <module>  
  2.     fetcher(x, 4)  
  3.   File "test.py", line 4, in fetcher  
  4.     return obj[index]  
  5. IndexError: string index out of range  

第一: try不仅捕获异常,而且会恢复执行
[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 4)  
  4.     except:  
  5.         print "got exception"  
  6.     print "continuing"  
输出:
[plain]  view plain copy print ?
  1. got exception  
  2. continuing  

第二:无论try是否发生异常,finally总会执行
[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 4)  
  4.     finally:  
  5.         print 'after fecth'  
输出:
[plain]  view plain copy print ?
  1. after fecth  
  2. Traceback (most recent call last):  
  3.   File "test.py", line 55, in <module>  
  4.     catcher()  
  5.   File "test.py", line 12, in catcher  
  6.     fetcher(x, 4)  
  7.   File "test.py", line 4, in fetcher  
  8.     return obj[index]  
  9. IndexError: string index out of range  

第三:try无异常,才会执行else
[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 4)  
  4.     except:  
  5.         print "got exception"  
  6.     else:  
  7.         print "not exception"  
输出:
[plain]  view plain copy print ?
  1. got exception  
[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 2)  
  4.     except:  
  5.         print "got exception"  
  6.     else:  
  7.         print "not exception"  
输出:
[plain]  view plain copy print ?
  1. not exception  
else作用:没有else语句,当执行完try语句后,无法知道是没有发生异常,还是发生了异常并被处理过了。通过else可以清楚的区分开。

第四:利用raise传递异常

[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 4)  
  4.     except:  
  5.         print "got exception"  
  6.         raise  
输出:
[plain]  view plain copy print ?
  1. got exception  
  2. Traceback (most recent call last):  
  3.   File "test.py", line 37, in <module>  
  4.     catcher()  
  5.   File "test.py", line 22, in catcher  
  6.     fetcher(x, 4)  
  7.   File "test.py", line 4, in fetcher  
  8.     return obj[index]  
  9. IndexError: string index out of range  
raise语句不包括异常名称或额外资料时,会重新引发当前异常。如果希望捕获处理一个异常,而又不希望

异常在程序代码中消失,可以通过raise重新引发该异常。


第五:except(name1, name2)

[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 4)  
  4.     except(TypeError, IndexError):  
  5.         print "got exception"  
  6.     else:  
  7.         print "not exception"  
捕获列表列出的异常,进行处理。若except后无任何参数,则捕获所有异常。

[python]  view plain copy print ?
  1. def catcher():  
  2.     try:  
  3.         fetcher(x, 4)  
  4.     except:  
  5.         print "got exception" 
<think>我们正在处理用户关于Python异常处理的问题,特别是try-except语法的示例和用法。 根据引用[1]和[2],我们可以知道Python异常处理的基本语法和一些高级用法。 引用[3]和[4]提供了简单的示例,展示了try-except的基本结构和常见错误。 我们将按照以下结构回答: 1. 基本语法:介绍try-except的基本结构。 2. 多个except块:处理多种异常类型。 3. 捕获所有异常:使用不带异常类型的except或捕获Exception基类。 4. else子句:当没有异常发生时执行的代码。 5. finally子句:无论是否发生异常都会执行的代码。 6. 获取异常信息:使用as关键字。 7. 自定义异常:简要提及如何自定义异常(虽然用户没有直接问,但作为扩展知识可以简单提一下)。 8. 最佳实践:根据引用[2]提供一些异常处理的最佳实践。 同时,我们需要注意用户要求生成相关问题,所以回答后需要生成相关问题。 注意:由于引用内容有限,我们主要基于已知的引用内容并结合一般知识进行回答。</think>### Python `try-except` 异常处理详解 #### 1. **基础语法结构** ```python try: # 可能引发异常的代码 result = 10 / 0 except Exception as e: # 异常处理逻辑 print(f"错误: {type(e).__name__}, 详情: {e}") ``` - `try` 块包含可能出错的代码 - `except` 捕获特定异常,`Exception as e` 捕获所有异常并获取实例 - 当除零错误发生时,程序不会崩溃,而是执行 `except` 块中的处理逻辑[^4] #### 2. **多异常处理** ```python try: data = [1,2]; print(data[5]) except (IndexError, KeyError) as e: print(f"索引/键错误: {e}") except ZeroDivisionError: print("数学运算错误") ``` - 使用元组同时捕获多种异常类型 - 多个 `except` 块按顺序匹配,类似 `switch-case` 逻辑[^2] #### 3. **完整语法组件** ```python try: file = open("test.txt") except FileNotFoundError as e: print(f"文件未找到: {e}") else: print("文件打开成功") # 仅当无异常时执行 finally: print("资源清理") # 无论是否异常都执行 file.close() if 'file' in locals() else None ``` - `else`:无异常时执行(适合放置依赖 `try` 成功执行的代码) - `finally`:强制执行的清理代码(如关闭文件/释放资源)[^1][^3] #### 4. **异常处理最佳实践** 1. **精确捕获**:避免裸 `except:`,明确指定异常类型 ```python # 不推荐 except: # 推荐 except (ValueError, TypeError): ``` 2. **异常上下文**:使用 `raise CustomError("msg") from e` 保留原始异常栈[^2] 3. **日志记录**:在 `except` 块中使用 `logging.exception(e)` 记录完整错误信息 4. **资源管理**:优先用 `with` 语句替代 `finally` 进行资源清理 ```python with open("data.txt") as f: # 自动处理文件关闭 content = f.read() ``` #### 5. **自定义异常示例** ```python class InvalidEmailError(ValueError): def __init__(self, email): super().__init__(f"{email} 格式非法") try: if "@" not in user_email: raise InvalidEmailError(user_email) except InvalidEmailError as e: print(e) # 输出:user@example 格式非法 ``` > **关键原则**:异常应处理 *预期可能发生* 的错误(如文件缺失/网络超时),而非替代常规流程控制[^2]。 --- ### 相关问题 1. 如何避免 `try-except` 掩盖潜在的程序逻辑错误? 2. 在异步编程(如 asyncio)中处理异常有哪些特殊注意事项? 3. 为什么说频繁使用异常处理会影响性能?如何优化? 4. 如何设计符合企业级应用规范的全局异常处理机制? [^1]: Pythontry... except异常处理使用简要说明 [^2]: Python异常处理(try-except)的完整语法与最佳实践 [^3]: pythontry except异常处理 [^4]: Python异常处理的基本语法(try-except
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值