在实际应用中,比如涉及文件读写、网络通信时,会因为文件不存在、权限不够、网络异常等原因引发异常,或者对数据库连接、查询、更新等操作,会因为连接超时、语法错误、唯一约束冲突等引发异常。
在Java或C#等语言中我们使用try-catch语句来捕捉异常,而在Python中,异常处理使用的是try-except
语句。虽然使用不同关键字,但是应用思维大同小异。
下面详细看下Python中的try-except
语句。
1、基本语法:
try: # 尝试执行的代码块 # 这里放可能会引发异常的代码
except ExceptionType1: # 如果try块中的代码引发了ExceptionType1异常,则执行此块 # 处理ExceptionType1异常的代码
except ExceptionType2: # 如果try块中的代码引发了ExceptionType2异常,则执行此块 # 处理ExceptionType2异常的代码
# ... 可以有多个except子句来处理不同类型的异常
except Exception as e: # 捕获所有未被特定except子句捕获的异常 # 处理异常的通用代码 print(f"An error occurred: {e}")
else: # 如果没有异常发生,则执行此块 # 通常用于执行依赖于try块成功执行的代码 print("No exception was raised")
finally: # 无论是否发生异常,都会执行此块 # 通常用于执行清理操作,如关闭文件或释放资源 print("This block will always be executed")
在上面的语法中:
try
块包含可能会引发异常的代码。except
块用于捕获并处理特定的异常。可以有多个except
子句,每个子句处理不同类型的异常。ExceptionType1
,ExceptionType2
等是要捕获的异常类型。这些异常可以是内置异常类型(如ValueError
,TypeError
,ZeroDivisionError
等)或自定义异常类型的名称。Exception
是一个通用的异常类,可以捕获所有未被特定except
子句捕获的异常。使用as e
可以将捕获的异常对象绑定到变量e
上,以便在except
块中引用它。else
块是可选的,当try
块中的代码成功执行而没有引发异常时,会执行else
块中的代码。finally
块也是可选的,但无论是否发生异常,它都会执行。通常用于执行清理操作,如关闭文件、释放资源等。
2、常见用法:
1、捕捉特定异常:
def divide_numbers(a, b): try: result = a / b return result except ZeroDivisionError: print("Error: Division by zero is not allowed.") # 这里可以选择返回一个值,抛出一个新的异常,或者做其他处理 return None # 测试
print(divide_numbers(10, 2)) # 输出: 5.0
print(divide_numbers(10, 0)) # 输出: Error: Division by zero is not allowed.
- 具体特定的异常常见的有:
名称 | 说明 |
---|---|
ValueError | 传入无效的参数。 |
TypeError | 对类型无效的操作。 |
Warning | 警告。 |
SyntaxError | 语法错误。 |
RuntimeError | 运行时错误。 |
ReferenceError | 引用错误。 |
ImportError | 导入失败。 |
LookupError | 无效数据查询的基类。 |
OSError | 操作系统错误。 |
2、处理多个异常类型:
try
{int result = Divide(10, 0); // 除以0的异常print("结果:" + result);
}
except DivideByZeroException as e:
{print("除以0异常:" + e.Message);
}
except ArithmeticException as e
{print("算术异常:" + e.Message);
}
3、文件操作:
当读取或写入文件时,可能会出现文件不存在、没有权限等异常情况。
try: with open('example.txt', 'r') as file: content = file.read()
except FileNotFoundError: print("文件不存在!")
except PermissionError: print("没有权限读取文件!")
except Exception as e: print(f"发生了一个错误: {e}")
4、网络请求
在发送HTTP请求时,可能会因为网络问题或服务器错误而失败。
import requests try: response = requests.get('http://example.com') response.raise_for_status() # 如果响应状态码不是200,则抛出HTTPError异常 print(response.text)
except requests.exceptions.HTTPError as errh: print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc: print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt: print("Timeout Error:", errt)
except requests.exceptions.RequestException as err: print("Something Else", err)
5. 用户输入验证
在接收用户输入时,可能需要进行一些验证,以确保输入是有效的。
try: age = int(input("请输入你的年龄: ")) if age < 0: raise ValueError("年龄不能是负数!")
except ValueError as e: print(e)
except Exception as e: print("发生了一个错误:", e)
6. 数据库操作
与数据库交互时,可能会遇到连接失败、查询错误等问题。
import sqlite3 try: # 连接到SQLite数据库(如果数据库不存在,则会自动在当前目录创建) conn = sqlite3.connect('example.db') c = conn.cursor() # 执行SQL命令 c.execute('''CREATE TABLE stocks (date text, trans text, symbol text, qty real, price real)''')
except sqlite3.Error as e: print(e)
finally: if (conn): conn.close()