找回密码
 会员注册
查看: 23|回复: 0

一文彻底搞定Python的Exception处理

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
69864
发表于 2024-9-10 16:00:50 | 显示全部楼层 |阅读模式
highlight:gruvbox-darktheme:cyanosis你好,我是shengjk1,多年大厂经验,努力构建通俗易懂的、好玩的编程语言教程。欢迎关注!你会有如下收益:了解大厂经验拥有和大厂相匹配的技术等希望看什么,评论或者私信告诉我!一、前言最近代码中也经常看到类似iffile_typein['doc','docx']:file_extension='docx'eliffile_typein['sheet','sheets']:file_type='sheet'file_extension='xlsx'else:raiseValueError("file_typenotin['doc','docx','xlsx']")1234567异常处理的代码,写惯了Java的友友就会不禁好奇,为啥是Error而不是Exception。Python中Error、Exception跟Java中的还真不一样。二、Exception2.1Exception定义异常(Exception)是指在程序执行期间出现的一些意外或异常情况,导致程序无法按照正常流程执行。异常通常是由于代码逻辑错误、外部环境变化等原因引起的,例如除零错误、文件不存在等。在Python中,异常被称为“Exception”。xxxError也是Exception的一种。比如:ValueError就是Exception的子类2.2应用场景:异常通常是由于意外或异常情况引起的,因此在代码中应该使用异常处理机制来捕获和处理异常,以保证程序的健壮性和稳定性。异常处理可以包括对异常的捕获、记录、报告、恢复或其他适当的操作。当您编写代码时,应该使用异常处理来处理可能出现的异常情况。以下是一些常见的情况,其中使用异常处理是很常见的:文件操作:在读取或写入文件时,可能会出现文件不存在、权限不足或文件格式错误等异常情况。使用异常处理可以捕获这些异常并采取适当的措施。try:file=open("myfile.txt","r")#进行文件读取操作exceptFileNotFoundError:print("文件不存在")exceptPermissionError:print("权限不足")exceptIOError:print("读取文件时发生错误")finally:file.close()#无论是否发生异常,都会执行文件关闭操作1234567891011网络请求:在进行网络请求时,可能会遇到连接超时、请求错误或服务器返回错误状态码等异常情况。使用异常处理可以捕获这些异常并进行相应的处理。importrequeststry:response=requests.get("https://api.example.com")response.raise_for_status()#检查响应状态码,如果不是200,则引发异常#处理响应数据exceptrequests.Timeout:print("请求超时")exceptrequests.HTTPErrorase:print("HTTP错误:",e)exceptrequests.RequestException:print("请求发生错误")123456789101112'运行运行数据验证:在处理用户输入或外部数据时,需要验证数据的有效性。如果数据不符合预期,可以引发相应的异常。defprocess_data(data):ifnotisinstance(data,list):raiseTypeError("数据应该是一个列表")#处理数据try:input_data=get_user_input()process_data(input_data)exceptTypeErrorase:print("数据处理错误:",e)12345678910这些示例只是一小部分常见的情况,使用异常处理可以帮助您处理不同类型的异常情况,提供错误信息,并采取适当的措施来处理异常。通过使用异常处理,您可以使程序更加健壮,并提供更好的用户体验,而不会导致程序崩溃或产生不可预料的结果。2.3异常的使用2.3.1抛出异常RaiseException使用 raise 语句可以显式地抛出异常。可以抛出内置的异常类,如 ValueError、TypeError,或自定义的异常类。抛出异常的语法是 raiseExceptionType("错误消息")。可以提供一个字符串作为错误消息,以便更好地描述异常情况。defdivide_numbers(num1,num2):ifnum2==0:raiseZeroDivisionError("Divisionbyzero")returnnum1/num2result=divide_numbers(10,0)print("结果:",result)1234567当num2=0时,也就是除数为0时,抛出异常ZeroDivisionError。2.3.2捕获异常(CatchException)使用 try-except 语句可以捕获并处理异常。try 块中的代码用于监视可能引发异常的操作。如果在 try 块中引发了异常,控制权将转移到与异常匹配的 except 块,该块用于处理该异常。可以使用多个 except 块来捕获不同类型的异常,以便为不同的异常提供特定的处理逻辑。可以使用单个 except 块来捕获多个异常类型,或者使用通用的 Exception 类来捕获所有异常。importrequeststry:response=requests.get("https://api.example.com")response.raise_for_status()#检查响应状态码,如果不是200,则引发异常#处理响应数据exceptrequests.Timeout:print("请求超时")exceptrequests.HTTPErrorase:print("HTTP错误:",e)exceptrequests.RequestException:print("请求发生错误")123456789101112'运行运行2.3.3finally块可以使用 finally 块来定义无论是否发生异常都会执行的代码块。无论异常是否被捕获或处理,finally 块中的代码都将执行。finally 块通常用于执行清理操作,如关闭文件或释放资源。try:num1=int(input("请输入一个整数:"))num2=int(input("请输入另一个整数:"))#可能引发异常的代码块result=num1/num2print("结果:",result)exceptValueError:print("输入的不是有效的整数")exceptZeroDivisionError:print("除数不能为零")else:print("没有发生异常")finally:print("异常处理结束")#示例输入:5、012345678910111213141516三、自定义异常鼓励程序员从 Exception类或它的某个子类来派生新的异常,比如:classMyCustomException(Exception):def__init__(self,message,error_code):super().__init__(message)self.error_code=error_code1234'运行运行在这个示例中,MyCustomException 类具有一个构造函数,接受 message 和 error_code 参数,并调用父类 Exception 的构造函数。此外,它还定义了一个 log_error 方法,用于记录错误信息。自定义异常使用:try:raiseMyCustomException("Somethingwentwrong",500)exceptMyCustomExceptionase:print("Caughtcustomexception:",e)1234总结Python中的异常处理机制能够有效地捕获和处理程序执行过程中的异常情况,确保程序的健壮性和稳定性。文章全面介绍了异常的基本概念、使用方式和自定义异常的方法,对于Python开发者来说是很好的参考资料。下面这张关系图来自Built-inExceptions—Python3.12.2documentationBaseException├──BaseExceptionGroup├──GeneratorExit├──KeyboardInterrupt├──SystemExit└──Exception├──ArithmeticError│├──FloatingPointError│├──OverflowError│└──ZeroDivisionError├──AssertionError├──AttributeError├──BufferError├──EOFError├──ExceptionGroup[BaseExceptionGroup]├──ImportError│└──ModuleNotFoundError├──LookupError│├──IndexError│└──KeyError├──MemoryError├──NameError│└──UnboundLocalError├──OSError│├──BlockingIOError│├──ChildProcessError│├──ConnectionError││├──BrokenPipeError││├──ConnectionAbortedError││├──ConnectionRefusedError││└──ConnectionResetError│├──FileExistsError│├──FileNotFoundError│├──InterruptedError│├──IsADirectoryError│├──NotADirectoryError│├──PermissionError│├──ProcessLookupError│└──TimeoutError├──ReferenceError├──RuntimeError│├──NotImplementedError│└──RecursionError├──StopAsyncIteration├──StopIteration├──SyntaxError│└──IndentationError│└──TabError├──SystemError├──TypeError├──ValueError│└──UnicodeError│├──UnicodeDecodeError│├──UnicodeEncodeError│└──UnicodeTranslateError└──Warning├──BytesWarning├──DeprecationWarning├──EncodingWarning├──FutureWarning├──ImportWarning├──PendingDeprecationWarning├──ResourceWarning├──RuntimeWarning├──SyntaxWarning├──UnicodeWarning└──UserWarning12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 06:32 , Processed in 0.493291 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表