什么是异常?
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
以下为简单的try....except...else
的语法:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
try
的工作原理是,当开始一个try
语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try
子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当
try
后的语句执行时发生异常,python就跳回到try
并执行第一个匹配该异常的except
子句,异常处理完毕,控制流就通过整个try
语句(除非在处理异常时又引发新的异常)。 - 如果在try后的语句里发生了异常,却没有匹配的
except
子句,异常将被递交到上层的try
,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。 - 如果在
try
子句执行时没有发生异常,python将执行else
语句后的语句(如果有else的话),然后控制流通过整个try
语句。
下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,且并未发生异常:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
以上程序输出结果:
$ python test.py
内容写入文件成功
$ cat testfile # 查看写入的内容
这是一个测试文件,用于测试异常!!
下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
在执行代码前为了测试方便,我们可以先去掉 testfile 文件的写权限,命令如下:
chmod -w testfile
再执行以上代码:
$ python test.py
Error: 没有找到文件或读取文件失败
try-finally 语句
在Python中,你可以使用try/finally
语句来确保某段代码无论是否引发异常都会执行。这在你需要确保某些资源正确释放,如文件或网络连接等情况下非常有用。
以下是一个基本的例子:
try:
f = open("test.txt", "r")
content = f.read()
finally: f.close()
在这个例子中,无论读取文件的过程中是否发生异常,f.close()
语句都会被执行,以确保文件资源被正确释放。
如果你需要处理可能引发的异常,你可以在try/finally
语句中加入except
子句:
try:
f = open("test.txt", "r")
content = f.read()
except FileNotFoundError:
print("File not found.")
finally: f.close()
在这个例子中,如果文件不存在,FileNotFoundError
异常将会被捕获并打印出错误信息,而finally
子句保证了无论如何都会执行f.close()
,确保文件资源被正确释放。
用户自定义异常
在Python中,你可以通过定义一个继承自Exception
的新类来创建自定义异常。自定义异常可以用于在特定情况下引发和捕获自定义错误。
以下是一个自定义异常的示例:
class MyCustomError(Exception):
pass def do_something():
raise MyCustomError("This is a custom error.")
try:
do_something()
except MyCustomError as e:
print(e)
在这个例子中,我们定义了一个名为MyCustomError
的自定义异常类,它继承自Exception
。在do_something()
函数中,我们使用raise
语句引发了一个MyCustomError
异常。在try/except
语句中,我们捕获了该异常,并打印出错误消息。
python 输出参数判断及处理
在 Python 中,命令行参数通过 sys.argv
列表提供,其中 sys.argv[0]
是脚本名称,其后的元素是传入的参数。你可以检查 sys.argv
的长度来确定传入了多少参数,并根据需要对这些参数进行检查。
下面是一个简单的 Python 脚本例子,它检查输入参数的个数,并对输入参数 1、2、3 进行检查:
import sys
# 检查我们是否得到了足够的参数(排除了脚本名称本身,所以加 1)
if len(sys.argv) < 4:
print("错误:未提供足够的参数。")
print("用法: python script.py 参数1 参数2 参数3")
sys.exit(1) # 非正常退出
# 参数已提供,可以进行处理
input_arg1 = sys.argv[1] # 输入参数1
input_arg2 = sys.argv[2] # 输入参数2
input_arg3 = sys.argv[3] # 输入参数3
# 对参数进行检查的示例
# 这里你可以加入任何具体的逻辑来检查参数值
try:
# 假设我们希望输入参数1是一个整数
arg1_int = int(input_arg1)
print(f"输入参数1是一个有效的整数: {arg1_int}")
except ValueError:
print(f"错误:输入参数1不是一个有效的整数: {input_arg1}") sys.exit(1)
# 假设我们希望输入参数2是一个浮点数
try:
arg2_float = float(input_arg2)
print(f"输入参数2是一个有效的浮点数: {arg2_float}")
except ValueError:
print(f"错误:输入参数2不是一个有效的浮点数: {input_arg2}")
sys.exit(1)
# 假设我们希望输入参数3是一个非空字符串
if input_arg3:
print(f"输入参数3是一个非空字符串: {input_arg3}")
else:
print("错误:输入参数3是一个空字符串")
sys.exit(1)
# 如果脚本到这里,说明所有参数都已成功验证
print("所有输入参数都已成功验证。")
使用此脚本时,请确保将 script.py
替换为你的脚本文件名。在命令行中运行它时,需要传入三个参数。如果没有提供足够的参数,或任何一个参数验证失败,脚本将打印一条错误消息并非正常退出。
例如,你可以像这样运行脚本:
python script.py 123 45.67 "Hello World"
这会检查第一个参数是否为整数,第二个参数是否为浮点数,第三个参数是否为非空字符串。