在 Python 中,错误与异常处理是非常重要的机制,它允许程序在遇到错误时不直接崩溃,而是提供一种捕获、处理和恢复的方式;异常处理可以让程序更加健壮,提高用户体验
1. 错误与异常
-
错误(Error):通常指程序中的问题,通常会导致程序停止运行
- 语法错误(SyntaxError):代码的语法不符合规定
- 逻辑错误(LogicalError):代码运行时的行为不符合预期
-
异常(Exception):是错误的一种类型,在 Python 中,异常是可以被捕捉和处理的;异常会中断程序的执行,但是我们可以通过捕捉并处理异常,避免程序崩溃
2. 异常处理机制
Python 使用 try、except、else、finally 等关键字来处理异常
2.1 try 和 except
try 块用于包含可能会抛出异常的代码;如果 try 块中的代码出现异常,Python 会跳转到相应的 except 块来处理该异常
语法:
try:
# 可能抛出异常的代码
except ExceptionType as e:
# 处理异常的代码
示例:
try:
x = 1 / 0 # 除零错误
except ZeroDivisionError as e:
print("Error:", e) # 输出错误信息
输出:
Error: division by zero
2.2 else 和 finally
else:如果try块中的代码没有抛出异常,else块将会执行finally:不论是否发生异常,finally块中的代码都会被执行;通常用于进行清理工作(如关闭文件或数据库连接)
语法:
try:
# 可能会抛出异常的代码
except ExceptionType as e:
# 处理异常的代码
else:
# 如果没有异常,执行此代码
finally:
# 不论是否发生异常,执行此代码
示例:
try:
x = 10 / 2
except ZeroDivisionError as e:
print("Error:", e)
else:
print("No error occurred.")
finally:
print("This block is always executed.")
输出:
No error occurred.
This block is always executed.
2.3 捕获多个异常
可以在一个 except 块中捕获多个异常,或者使用多个 except 块分别处理不同类型的异常
示例 1: 捕获多个异常类型:
try:
num = int(input("Enter a number: "))
result = 10 / num
'''input("Enter a number: "):首先,程序提示用户输入一个数字
input() 函数返回的是字符串类型
int(input(...)):将用户输入的字符串转换为整数
如果用户输入的内容无法转换为整数(例如,输入了字母或其他非法字符),
就会抛出 ValueError 异常
result = 10 / num:然后,程序尝试用 10 除以用户输入的数字 num
如果 num 是 0,程序会抛出 ZeroDivisionError 异常'''
except (ValueError, ZeroDivisionError) as e:
print(f"Error: {e}")
'''except (ValueError, ZeroDivisionError):
这里,except 捕获了两种类型的异常:ValueError 和 ZeroDivisionError
ValueError:当用户输入不能转换为整数时触发
(例如,输入了字母或者其他无法转换为整数的字符串)
ZeroDivisionError:
当用户输入 0 时触发,因为除以零在数学上是不可行的,会抛出该异常
as e:将捕获的异常赋值给变量 e,这样就可以获取异常的具体信息
print(f"Error: {e}"):打印出捕获到的异常信息
e 会包含异常的描述信息,
例如:“invalid literal for int() with base 10: 'abc'” 或者 “division by zero”
input() 函数是 Python 中用于从用户获取输入的内置函数
它会暂停程序的执行,等待用户输入,并返回用户输入的内容(作为字符串)
基本用法
user_input = input("Please enter something: ")
print(f"You entered: {user_input}")
input(prompt):prompt 是一个可选参数,它用于向用户显示提示信息
在用户输入内容之前,提示信息会被打印出来
返回值:input() 总是返回一个字符串类型的结果,无论用户输入的是数字、字符还是其他内容
因此,如果你需要将输入转换为其他类型(如整数或浮点数),
需要使用类型转换函数,例如 int() 或 float()
示例
获取用户输入并打印:
name = input("Enter your name: ")
print(f"Hello, {name}!")
如果用户输入的是 Alice,输出将是:
Hello, Alice!
将输入转换为整数:
age = int(input("Enter your age: "))
print(f"You are {age} years old.")
如果用户输入的是 25,输出将是:
You are 25 years old.
处理输入为浮点数:
height = float(input("Enter your height in meters: "))
print(f"Your height is {height} meters.")
如果用户输入的是 1.75,输出将是:
Your height is 1.75 meters.
特点
输入的内容总是字符串:无论用户输入什么内容,input() 返回的都是一个字符串
如果需要将输入转换为其他数据类型,需要显式转换(如 int() 或 float())
阻塞等待用户输入:input() 会暂停程序执行,直到用户提供输入并按下回车键
在 Python 2.x 中,input() 会执行输入的代码,而 raw_input() 才是获取用户输入的正确方法
但在 Python 3.x 中,input() 始终返回字符串'''
示例 2: 分别捕获不同类型的异常:
try:
num = int(input("Enter a number: "))
result = 10 / num
except ValueError as e:
print("Invalid input, not a number.")
except ZeroDivisionError as e:
print("Can't divide by zero.")
except Exception as e:
print("An unexpected error occurred:", e)
2.4 获取异常信息
在 except 块中,使用 as 关键字来捕获异常对象,并可以访问异常的详细信息
示例:
try:
x = 1 / 0
except ZeroDivisionError as e:
print("Caught exception:", e)
输出:
Caught exception: division by zero
2.5 自定义异常
Python 允许用户创建自定义异常类型;你可以通过继承 Exception 类来创建自己的异常
示例:
class MyCustomError(Exception):
def __init__(self, message):
super().__init__(message)
'''class MyCustomError(Exception):
这行代码定义了一个名为 MyCustomError 的新异常类
它继承自 Python 内置的 Exception 类
Exception 类是所有内置异常的基类,也可以作为创建自定义异常类的基类
它有一个构造方法 __init__,用于接收错误信息并将其存储,
以便在异常被抛出时可以显示该信息
def __init__(self, message):
这是该异常类的构造方法(初始化方法),接受一个 message 参数
这个参数将是一个字符串,用于描述异常的原因或错误信息
super().__init__(message):
super() 调用的是父类 Exception 的构造方法
通过调用 super().__init__(message),
将 message 传递给 Exception 类的构造函数,
这样异常实例就可以保存该消息并在异常被触发时显示出来'''
try:
raise MyCustomError("Something went wrong!")
except MyCustomError as e:
print("Caught custom exception:", e)
'''try::try 块用于包含可能引发异常的代码
在这里,try 块中有一行代码显式地引发了一个 MyCustomError 异常
raise MyCustomError("Something went wrong!"):
raise 关键字用于主动触发异常
在这个例子中,代码会引发一个 MyCustomError 类型的异常,
并附带了错误消息 "Something went wrong!"
except MyCustomError as e:
except 块用于捕获并处理特定类型的异常
这里的 except 捕获了 MyCustomError 类型的异常,
并将异常实例赋值给变量 e
这样,就可以在后续代码中访问该异常对象
print("Caught custom exception:", e):
在 except 块中,print 语句打印出异常的信息,e 代表捕获到的异常对象
由于 MyCustomError 类继承自 Exception 类,
所以 e 包含了 MyCustomError 异常的错误消息,
也就是 "Something went wrong!"'''
输出:
Caught custom exception: Something went wrong!
2.6 try 和 except 的嵌套
try 和 except 块可以嵌套使用,用于更复杂的异常处理场景
示例:
try:
try:
x = 10 / 0
except ZeroDivisionError as e:
print("Inner exception:", e)
raise # 重新抛出异常
'''内层 try 块的代码尝试执行 x = 10 / 0,这是一个除以零的操作,
因此会抛出一个 ZeroDivisionError 异常
异常被 except ZeroDivisionError as e 捕获,进入 except 块
在 except 块中,print("Inner exception:", e)
会打印 "Inner exception: division by zero",
这就是 Python 抛出的 ZeroDivisionError 异常的消息
然后,raise 语句会重新抛出当前捕获的异常(ZeroDivisionError)
这意味着异常会被再次传递给外层 except 块进行处理'''
except Exception as e:
print("Outer exception:", e)
'''外层 try 块试图执行一些代码
如果内层代码块(包括内层的异常处理)出现任何未被处理的异常,
外层 except 会捕获这些异常并打印出相关的错误信息
外层 except 块捕获所有类型的异常(通过 Exception 类)
因为内层的异常被重新抛出并传递到外层,
外层 except 会接收到 ZeroDivisionError 异常
然后,print("Outer exception:", e) 会打印外层异常的消息
由于异常是 ZeroDivisionError,
打印的内容会是 "Outer exception: division by zero"'''
输出:
Inner exception: division by zero
Outer exception: division by zero
3. 常见异常类型
Python 内置了很多常见的异常类型,以下是一些常见的异常类型:
ValueError:参数值不正确时抛出IndexError:访问列表、元组等序列时索引超出范围KeyError:字典中访问不存在的键时抛出TypeError:数据类型不匹配时抛出FileNotFoundError:文件没有找到时抛出ZeroDivisionError:除以零时抛出AttributeError:对象没有该属性时抛出IOError:输入输出操作异常
4. 总结
try:用于包裹可能抛出异常的代码except:捕捉并处理异常,可以指定异常类型,也可以捕捉所有异常else:如果没有异常发生,则执行else块finally:无论是否发生异常,finally块总会执行,常用于清理工作- 自定义异常:可以自定义异常类型,通过继承
Exception类
通过异常处理,Python 程序能够更加健壮,避免因错误导致程序崩溃;它是一个非常重要的编程工具,尤其在处理外部输入、文件操作、数据库访问等环节时尤其重要
2317

被折叠的 条评论
为什么被折叠?



