前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python 入门第十七讲】异常处理

【Python 入门第十七讲】异常处理

原创
作者头像
GoBoy
发布2024-02-18 17:29:55
26300
代码可运行
发布2024-02-18 17:29:55
举报
运行总次数:0
代码可运行

在本文中,我们将讨论如何在适当的示例的帮助下使用 try、except 和 finally 语句处理 Python 中的异常。

Python 中的错误可以分为两种类型,语法错误和异常。错误是程序中的问题,程序将因此停止执行。另一方面,当发生一些内部事件时,会引发异常,这些事件改变了程序的正常流程。

python 中不同类型的异常:

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

SyntaxError:当解释器在代码中遇到语法错误(例如关键字拼写错误、缺少冒号或括号不平衡)时,将引发此异常。

TypeError:当操作或函数应用于错误类型的对象(例如将字符串添加到整数)时,将引发此异常。

NameError:当在当前作用域中找不到变量或函数名称时,将引发此异常。

IndexError:当索引超出列表、元组或其他序列类型的范围时,将引发此异常。

KeyError:当在字典中找不到键时,会引发此异常。

ValueError:当使用无效的参数或输入调用函数或方法时,例如,当字符串不表示有效整数时,尝试将字符串转换为整数,则会引发此异常。

AttributeError:当在对象上找不到属性或方法时,例如尝试访问类实例的不存在的属性,则会引发此异常。

IOError:当 I/O 操作(如读取或写入文件)由于输入/输出错误而失败时,会引发此异常。

ZeroDivisionError:尝试将数字除以零时,会引发此异常。

ImportError:当 import 语句无法找到或加载模块时,将引发此异常。

这些只是 Python 中可能发生的多种异常类型的几个示例。实际项目开发过程中请务必使用 try-except 块或其他错误处理技术正确处理代码中的异常,以便优雅地处理错误并防止程序崩溃。

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

语法错误:

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

例:

代码中存在语法错误。' 语句后应跟冒号 ( : ),并且 ' 语句应缩进以位于 ' print' if' if' 块内。

代码语言:python
代码运行次数:0
复制
amount = 10000
if(amount > 2999)
print("You are eligible to purchase Dsa Self Paced")

输出:

代码语言:python
代码运行次数:0
复制
  File "E:\StudyPython\lesson-list\demo_list.py", line 9
    if(amount > 2999)
                     ^
SyntaxError: invalid syntax

异常:

当程序在语法上正确,但代码导致错误时,会引发异常。此错误不会停止程序的执行,但是,它会更改程序的正常流程。

在此代码中,我们将“标记”除以零,因此将发生称为“ZeroDivisionError”的错误

代码语言:python
代码运行次数:0
复制
marks = 10000
a = marks / 0
print(a)

输出:

在上面的例子中,当我们试图将一个数字除以 0 时,引发了 ZeroDivisionError。

注意:Exception 是 Python 中所有异常的基类。可以阅读源码查看异常层次结构。

例:

TypeError:当操作或函数应用于错误类型的对象时,会引发此异常。下面是一个示例:

这里会引发“TypeError”,因为要添加的两种数据类型不同。

代码语言:python
代码运行次数:0
复制
x = 5
y = "hello"
z = x + y

输出:

尝试 catch 块来解决它:

代码尝试将整数 (x) 和字符串 (y) 相加,这不是有效的操作,它将引发 x y TypeError 。代码使用 tryexcept' 块来捕获此异常并打印错误消息。

代码语言:python
代码运行次数:0
复制
x = 5
y = "hello"
try:
	z = x + y
except TypeError:
	print("Error: cannot add an int and a str")

输出:

Try and except 语句:捕获异常

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

示例:

这里我尝试访问索引越界的数组元素并处理相应的异常。

代码语言:python
代码运行次数:0
复制
a = [1, 2, 3]
try: 
	print ("Second element = %d" %(a[1]))

	print ("Fourth element = %d" %(a[3]))

except:
	print ("An error occurred")

输出:

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

捕获特定异常

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

代码语言:python
代码运行次数:0
复制
try:
    # statement(s)
except IndexError:
    # statement(s)
except ValueError:
    # statement(s)

示例:

在 Python 中捕获特定异常

该代码定义了一个函数 fun(a),该函数根据输入a进行b计算。如果a小于 4,则尝试除以零,从而产生ZeroDivisionError代码调用fun(3)fun(5)在 try-except 块内。它处理ZeroDivisionError中的fun(3)并打印“ZeroDivisionError Occurred and Handled”。NameError

块不执行,因为代码中没有NameError异常。

代码语言:python
代码运行次数:0
复制
def fun(a):
	if a < 4:

		b = a/(a-3)
	print("Value of b = ", b)
	
try:
	fun(3)
	fun(5)
except ZeroDivisionError:
	print("ZeroDivisionError Occurred and Handled")
except NameError:
	print("NameError Occurred and Handled")

输出:

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

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

Try with Else Clause

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

示例:

该代码定义了一个函数,该函数AbyB(a, b)计算c为 ((a+b) / (a-b)) 并处理一个势ZeroDivisionError.如果没有除以零错误,它会打印结果。调用计算并打印 ,而调用AbyB(2.0, 3.0) 和 AbyB(3.0, 3.0)尝试除以零-5.0,导致捕获 aZeroDivisionError,并打印“a/b results in 0”。

代码语言:python
代码运行次数:0
复制
def AbyB(a , b):
	try:
		c = ((a+b) / (a-b))
	except ZeroDivisionError:
		print ("a/b result in 0")
	else:
		print (c)
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)

输出:

Finally Python 中的关键字

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

语法:

代码语言:python
代码运行次数:0
复制
try:
    # Some Code.... 

except:
    # optional block
    # Handling of exception (if required)

else:
    # execute if no exception

finally:
    # Some code .....(always executed)

示例:

该代码尝试执行整数除以零,从而得到ZeroDivisionError.它捕获异常并打印“不能除以零”。无论异常情况如何,finally该块都会被执行并打印“This is always executed”。

代码语言:python
代码运行次数:0
复制
try:
	k = 5//0
	print(k)

except ZeroDivisionError:
	print("Can't divide by zero")

finally:
	print('This is always executed')

输出:

Raising Exception

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

此代码有意使用try块中的raise语句引发消息NameError“Hi there”。然后,它捕获异常,打印“异常”,并使用raise重新引发相同的NameError异常。这演示了如何在 Python 中引发和处理异常,从而允许自定义错误消息和进一步的异常传播。

代码语言:python
代码运行次数:0
复制
try: 
	raise NameError("Hi there")
except NameError:
	print ("An exception")
	raise

上述代码的输出将简单地打印为“异常”,但由于最后一行中的 raise 语句,最后一行也会发生运行时错误。因此,命令行上的输出将如下所示

异常处理的优点:

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

异常处理的缺点:

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

总的来说,Python 中异常处理的好处大于缺点,但重要的是要明智而谨慎地使用它,以保持代码质量和程序可靠性。

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python 中不同类型的异常:
  • 语法错误和异常之间的区别
    • 语法错误:
      • 异常:
      • Try and except 语句:捕获异常
        • 示例:
        • 捕获特定异常
          • 示例:
          • Try with Else Clause
            • 示例:
            • Finally Python 中的关键字
              • 语法:
                • 示例:
                • Raising Exception
                • 异常处理的优点:
                • 异常处理的缺点:
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                http://www.vxiaotou.com