Python异常处理

在Python中,异常处理是一种机制,用于处理在程序执行过程中可能出现的错误或异常情况,以防止程序崩溃。异常处理通过使用try和except块来捕获和处理异常。

在Python中,异常处理是一种机制,用于处理在程序执行过程中可能出现的错误或异常情况,以防止程序崩溃。异常处理通过使用try和except块来捕获和处理异常。

python中不同类型的异常

在 Python 中,有几个内置异常,当程序执行期间发生错误时可能会引发这些异常。以下是 Python 中一些最常见的异常类型:

  • SyntaxError:当解释器在代码中遇到语法错误(例如拼写错误的关键字、缺少冒号或括号)时,会引发此异常。
  • TypeError:当将操作或函数应用于错误类型的对象时(例如将字符串添加到整数中),会引发此异常。
  • NameError:当在当前作用域中找不到变量或函数名称时,会引发此异常。
  • IndexError:当索引超出列表、元组或其他序列类型的范围时,会引发此异常。
  • KeyError:当在字典中找不到键时会引发此异常。
  • ValueError:当使用无效参数或输入调用函数或方法时,例如在字符串不表示有效整数时尝试将字符串转换为整数时,会引发此异常。
  • AttributeError:当在对象上找不到属性或方法时,例如尝试访问类实例不存在的属性时,会引发此异常。
  • IOError:当 I/O 操作(例如读取或写入文件)由于输入/输出错误而失败时,会引发此异常。
  • ZeroDivisionError:尝试将数字除以零时会引发此异常。
  • ImportError:当导入语句无法找到或加载模块时,会引发此异常。

这些只是 Python 中可能发生的多种异常类型的几个示例。使用 try-except 块或其他错误处理技术在代码中正确处理异常非常重要,以便方便处理错误并防止程序崩溃。

语法错误和异常之间的区别

语法错误:顾名思义,此错误是由代码中的错误语法引起的。它导致程序终止。

例子:

# 初始化变量 amount
amount = 10000

# 检查您是否有资格购买 Dsa Self Paced
if amount > 2999:
    print("您有资格购买")

输出:

Python异常处理

异常:当程序语法正确但代码导致错误时,就会引发异常。该错误不会停止程序的执行,但是会改变程序的正常流程。

例子:

# initialize the amount variable
marks = 10000

# perform division with 0
a = marks / 0
print(a)

输出:

Python异常处理

在上面的示例中,当我们尝试将数字除以 0 时,引发了 ZeroDivisionError。

注意: Exception是Python中所有异常的基类。

例子:

 1) TypeError:当对错误类型的对象应用操作或函数时,会引发此异常。这是一个例子:

x = 5
y = "hello"
z = x + y # Raises a TypeError: unsupported operand type(s) for +: 'int' and 'str'

输出:

Traceback (most recent call last):
  File "7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py", line 4, in <module>
    z = x + y
TypeError: unsupported operand type(s) for +: 'int' and 'str'

尝试 catch 块来解决它:

x = 5
y = "hello"
try:
	z = x + y
except TypeError:
	print("Error: cannot add an int and a str")

输出:

Error: cannot add an int and a str

Try 和 except 语句 – 捕获异常

Try 和 except 语句用于捕获和处理 Python 中的异常。可以引发异常的语句保留在 try 子句中,而处理异常的语句则写在 except 子句中。

示例:让我们尝试访问索引越界的数组元素并处理相应的异常。

# Python program to handle simple runtime error
#Python 3

a = [1, 2, 3]
try:
	print ("Second element = %d" %(a[1]))

	# Throws error since there are only 3 elements in array
	print ("Fourth element = %d" %(a[3]))

except:
	print ("An error occurred")

输出:

Second element = 2
An error occurred

在上面的示例中,可能导致错误的语句被放置在 try 语句中(在我们的例子中是第二个 print 语句)。第二个打印语句尝试访问列表中不存在的第四个元素,这会引发异常。然后这个异常被 except 语句捕获。

捕获特定异常

一条 try 语句可以有多个 except 子句,以指定不同异常的处理程序。请注意,最多会执行一个处理程序。例如,我们可以在上面的代码中添加IndexError。添加特定异常的一般语法是:

try: 
    # 语句
except IndexError: 
    # 语句
except ValueError: 
    # 语句

示例:捕获 Python 中的特定异常

# Program to handle multiple errors with one
# except statement
# Python 3

def fun(a):
	if a < 4:

		# throws ZeroDivisionError for a = 3
		b = a/(a-3)

	# throws NameError if a >= 4
	print("Value of b = ", b)
	
try:
	fun(3)
	fun(5)

# note that braces () are necessary here for
# multiple exceptions
except ZeroDivisionError:
	print("ZeroDivisionError Occurred and Handled")
except NameError:
	print("NameError Occurred and Handled")

输出:

ZeroDivisionError Occurred and Handled

如果您对 fun(3) 行进行注释,则输出将为:

NameError Occurred and Handled

上面的输出之所以如此,是因为只要 python 尝试访问 b 的值,就会发生 NameError。 

尝试使用 Else 子句

在 Python 中,您还可以在 try- except 块上使用 else 子句,该块必须出现在所有 except 子句之后。仅当 try 子句不引发异常时,代码才会进入 else 块。

示例:尝试使用 else 子句

# 展示带有 try-except 的 else 子句的程序
# Python 3
# 定义一个返回 a/b 结果的函数
def AbyB(a, b):
    try:
        c = ((a + b) / (a - b))
    except ZeroDivisionError:
        print("a/b 的结果为 0")
    else:
        print(c)

# 驱动程序来测试上述函数
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)

输出:

-5.0 
a/b 的结果为 0

Python 中的finally关键字

Python 提供了一个关键字finally,它总是在 try 和 except 块之后执行。Final块总是在try块正常终止之后或者try块由于某种异常而终止之后执行。

语法:

try: 
    # 一些代码.... 

except: 
    # 可选块
    # 异常处理(如果需要)

else: 
    # 如果没有异常则执行

finally: 
    # 一些代码.....(总是执行)

例子:

# Python程序演示finally块的用法

# 在try块中没有引发异常
try:
    k = 5 // 0  # 引发除零异常
    print(k)

# 处理除零异常
except ZeroDivisionError:
    print("不能除以零")

finally:
    # 无论是否引发异常,这个块都会被执行
    print('这总是会被执行')

输出:

不能除以零
这总是会被执行

引发异常

raise 语句允许程序员强制发生特定的异常。raise 中的唯一参数指示要引发的异常。这必须是异常实例或异常类(从 Exception 派生的类)。

# 程序演示引发异常

try:
    raise NameError("Hi there")  # 引发错误
except NameError:
    print("异常")
    raise  # 用于确定是否引发了异常

上面代码的输出将简单地打印为“异常”,但由于最后一行中的 raise 语句,最后也会出现运行时错误。因此,命令行上的输出将类似于 

文件“/home/d6ec14ca595b97bff8d8034bbf212a9f.py”,第 5 行,在 <module> 中
    raise NameError("Hi There") # Raise Error 
NameError: Hi There

异常处理的优点:

  • 提高程序可靠性:通过正确处理异常,您可以防止程序因意外错误或输入而崩溃或产生不正确的结果。
  • 简化的错误处理:异常处理允许您将错误处理代码与主程序逻辑分开,从而更容易阅读和维护代码。
  • 更干净的代码:通过异常处理,您可以避免使用复杂的条件语句来检查错误,从而获得更干净且更具可读性的代码。
  • 更轻松的调试:当引发异常时,Python 解释器会打印回溯,显示异常发生的确切位置,从而更轻松地调试代码。

异常处理的缺点:

  • 性能开销:异常处理可能比使用条件语句检查错误慢,因为解释器必须执行额外的工作来捕获和处理异常。
  • 增加代码复杂性:异常处理可能会使您的代码更加复杂,特别是当您必须处理多种类型的异常或实现复杂的错误处理逻辑时。
  • 可能的安全风险:异常处理不当可能会泄露敏感信息或在代码中创建安全漏洞,因此仔细处理异常并避免暴露太多有关程序的信息非常重要。

总体而言,Python 中异常处理的优点大于缺点,但为了保持代码质量和程序可靠性,明智且谨慎地使用它非常重要。

原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/python-exception-handling/

(0)
上一篇 2023年9月24日
下一篇 2023年9月25日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注