免费申请网站官网,网站移动端推广,开发一款像淘宝的app需要多少钱,平面设计上班都干啥1. 什么是错误和异常
在Python中#xff0c;错误可以分为两类#xff1a;
语法错误(Syntax Errors)#xff1a;代码不符合Python语法规则异常(Exceptions)#xff1a;语法正确的代码在运行时发生的错误
# 语法错误示例
print(Hello World # 缺少右括号# 异…
1. 什么是错误和异常
在Python中错误可以分为两类
语法错误(Syntax Errors)代码不符合Python语法规则异常(Exceptions)语法正确的代码在运行时发生的错误
# 语法错误示例
print(Hello World # 缺少右括号# 异常示例
print(10 / 0) # ZeroDivisionError: division by zero2. 常见的异常类型
Python内置了许多异常类型常见的有
# NameError - 尝试访问未定义的变量
print(undefined_variable)# TypeError - 类型操作错误
2 2 # 不能将字符串和整数相加# IndexError - 索引超出范围
lst [1, 2, 3]
print(lst[3](ref)# KeyError - 字典键不存在
d {a: 1}
print(d[b])# FileNotFoundError - 文件不存在
open(nonexistent.txt)3. 异常处理try-except语句
使用try-except可以捕获并处理异常
try:# 可能引发异常的代码result 10 / 0
except ZeroDivisionError:# 处理特定异常print(不能除以零!)捕获多种异常
try:num int(input(请输入一个数字: ))result 100 / numprint(结果是:, result)
except ValueError:print(输入的不是有效数字!)
except ZeroDivisionError:print(不能输入零!)
except Exception as e: # 捕获所有其他异常print(f发生未知错误: {e})4. try-except-else-finally完整结构
try:file open(example.txt, r)content file.read()
except FileNotFoundError:print(文件不存在!)
else:# 如果没有异常发生执行else块print(文件内容:, content)
finally:# 无论是否发生异常都会执行print(清理工作...)if file in locals() and not file.closed:file.close()5. 抛出异常raise语句
我们可以主动抛出异常
def check_age(age):if age 0:raise ValueError(年龄不能为负数)elif age 18:raise ValueError(未成年禁止访问)else:print(欢迎访问)try:check_age(-5)
except ValueError as e:print(f错误: {e})6. 自定义异常
我们可以创建自己的异常类型
class MyCustomError(Exception):自定义异常类 - 用于演示特定业务场景的错误def __init__(self, message, error_code500):self.message messageself.error_code error_codesuper().__init__(f错误代码 {error_code}: {message})def __str__(self):自定义异常信息的字符串表示形式return f[{self.__class__.__name__}] {self.message}def calculate_division(dividend, divisor):演示函数执行除法运算当条件不满足时抛出不同类型的异常if not isinstance(dividend, (int, float)) or not isinstance(divisor, (int, float)):raise TypeError(被除数和除数必须是数字类型)if divisor 0:raise ZeroDivisionError(除数不能为零)if dividend 0 or divisor 0:# 抛出自定义异常当输入为负数时raise MyCustomError(计算不支持负数输入, error_code400)return dividend / divisordef main():主函数演示异常的捕获和处理流程print( 自定义异常演示程序 )while True:try:# 获取用户输入num1 float(input(\n请输入被除数输入q退出))num2 float(input(请输入除数))# 执行计算result calculate_division(num1, num2)print(f计算结果{num1} ÷ {num2} {result})except ValueError as e:# 处理非数字输入if q in str(e).lower():print(程序已退出)breakprint(f输入错误请输入有效的数字。错误详情{e})except ZeroDivisionError as e:# 处理内置异常print(f数学错误{e})except MyCustomError as e:# 处理自定义异常print(f业务错误{e}错误代码{e.error_code})except TypeError as e:# 处理类型错误print(f类型错误{e})except Exception as e:# 捕获所有其他未预期的异常print(f未知错误{e})breakif __name__ __main__:main() 这个示例程序包含以下关键特性 自定义异常类MyCustomError继承自Exception包含错误信息和错误代码异常抛出函数calculate_division根据不同条件抛出不同类型的异常多级异常捕获在main函数中使用多个except块分别处理不同类型的异常用户交互通过控制台输入演示异常的触发和处理流程 你可以运行这段代码并尝试以下输入场景 正常输入两个正数如10和2输入零作为除数触发ZeroDivisionError输入负数触发MyCustomError输入非数字字符触发ValueError输入q退出程序 通过观察不同输入下的输出结果你可以深入理解自定义异常的工作机制和优势。
7. 断言assert
assert用于确保某个条件为真否则抛出AssertionError
def divide(a, b):assert b ! 0, 除数不能为零return a / bprint(divide(10, 2)) # 正常
print(divide(10, 0)) # 抛出AssertionError8. 实际应用案例
案例1处理用户输入
while True:try:age int(input(请输入您的年龄: ))if age 0:raise ValueError(年龄不能为负数)breakexcept ValueError as e:print(f无效输入: {e})print(f您的年龄是: {age})案例2文件操作
def read_file(filename):try:with open(filename, r) as file:return file.read()except FileNotFoundError:print(f文件 {filename} 不存在)return Noneexcept IOError:print(f读取文件 {filename} 时发生错误)return Nonecontent read_file(data.txt)
if content:print(文件内容:, content)案例3网络请求
import requestsdef fetch_url(url):try:response requests.get(url, timeout5)response.raise_for_status() # 如果请求不成功抛出HTTPErrorreturn response.textexcept requests.exceptions.Timeout:print(请求超时)except requests.exceptions.HTTPError as err:print(fHTTP错误: {err})except requests.exceptions.RequestException as err:print(f请求错误: {err})return Nonehtml fetch_url(https://www.example.com)
if html:print(获取内容成功!)9. 异常处理的最佳实践
1.不要过度使用try-except只捕获你知道如何处理的异常2.尽量具体捕获特定异常而不是通用的Exception3.记录异常信息使用logging模块记录异常详情4.保持简洁try块中只包含可能引发异常的代码5.清理资源使用finally或上下文管理器(with语句)确保资源释放
import logginglogging.basicConfig(filenameapp.log, levellogging.ERROR)def process_data(data):try:# 只包含可能引发异常的代码result complex_operation(data)except ValueError as e:logging.error(f处理数据时发生值错误: {e})return Noneexcept DatabaseError as e:logging.error(f数据库错误: {e})return Noneelse:return result10. 总结
异常处理是Python编程中非常重要的部分合理使用异常处理可以使程序
更加健壮能够处理意外情况更易于调试和维护提供更好的用户体验
异常处理不是用来隐藏错误的而是为了优雅地处理错误情况