点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达
速读仅需 4 分钟
/ python 生产实战 高效优雅处理程序错误 /
今天,讨论一下程序中的错误处理。也许你会觉得这个事没什么意思,处理错误的代码并不难写。但你想过没有,要把错误处理写好,并不是件容易的事情。另外,任何一个稳定的程序中都会有大量的代码在处理错误,所以说,处理错误是程序中一件比较重要的事情。本篇我们系统地了解一下错误处理的各种方式和相关实践。
错误是指导致系统不能按照用户意图工作的一切原因、事件。在程序设计过程中,由于某些错误的存在,致使程序无法正常运行,处理这些错误以使程序正确运行就称为错误处理。错误处理功能是衡量编译器性能的重要方面,它在帮助程序员尽快修改程序方面起到了非常重要的作用。
1
程序错误类型
1.1
语法错误
语法错误是因为源程序中不正确的代码产生的,即在编写程序时没有遵守语法(或词法)规则,书写了错误的语法代码,从而导致编译器无法正确解释源代码而产生的错误,通常是由于录入的错误引起的,它在词法分析或语法分析时检测出来。如“非法字符”、“括号不匹配”、“缺少;”之类的错误。
1.2
语义错误
语义错误是指源程序中不符合语义规则的错误,即一条语句试图执行一条不可能执行的操作而产生的错误。语义错误有的在语义分析时检测处来,有的在运行时才能检测出来。如变量声明错误、作用域错误、数据存储区的溢出等错误。
1.3
逻辑错误
逻辑错误是指程序的运行结果和程序员的设想有出入时产生的错误。这类错误并不直接导致程序在编译期间和运行期间出现错误,但是程序未按预期方式执行,产生了不正确的运行结果,较难发现。这种错误只能通过分析结果,将结果与设计方案进行对比来发现。
2
HTTPException
我们用 HTTPException 模块返回带错误信息的 Response。HTTPException 是一个普通的 Python 异常,同时带有与 API 访问有关的附加数据。
3
添加自定义头信息
有时候针对 HTTP 错误,在一些场景下,我们需要添加自定义头信息
4
自定义异常处理器
在 fastapi 中借助 the same exception utilities from Starlette,我们可以添加自定义异常处理器。假设我们有个自定义异常 UnicornException,我们想在全局范围内处理这个异常。借助 @app.exception_handler(),就可以实现我们的目标。
5
重写缺省异常处理器
fastapi 有一些缺省的异常处理器。当我们抛出 HTTPException 异常或者当请求有非法数据的时候,这些处理器负责返回默认的 JSON 结果。我们可以重写这些异常处理器。
5.1
重写请求校验异常处理器
当一个请求包含非法数据的时候,fastapi 内部会抛出 RequestValidationError 异常,并且有默认的异常处理器来处理。我们可以用 @app.exception_handler(RequestValidationError) 来重写这个异常处理器。
5.2
重写 HTTPException 异常处理器
同样的方法,我们可以重写 HTTPException 异常处理器。例如,你可能想返回纯文本格式而不是 JSON 格式的错误信息。
5.3
重用缺省异常处理器
我们可以导入并且重用缺省的异常处理器。我们从 fastapi.exception_handlers 导入缺省异常处理器。
在示例中,我们在抛出异常之前添加了一条日志输出。我们可以根据业务需求灵活的重用缺省异常处理器。
6
fastapi HTTPException 对比 Starlette HTTPException
fastapi 中 HTTPException 继承自 Starlette 的 HTTPException。
唯一的区别 fastapi 中 HTTPException 允许你在 response 添加头信息。主要在内部用于 OAuth 2.0 以及一些安全相关的功能。
因此,通常我们在代码中抛出 fastapi 的 HTTPException 异常。但是,当我们注册异常处理器的时候,我们应该注册为 Starlette 的 HTTPException。这样,当 Starlette 的内部代码或者 Starlette 扩展插件抛出 Starlette HTTPException 时,我们的处理器才能正常捕获和处理这个异常。如果我们要在代码中同时使用这两个类,为了避免命名冲突,我们可以重命名其中一个类。
7
总结
1.介绍了 什么是错误以及错误的分类信息
2.在 fastapi 中是如何自定义异常处理
原创不易,只愿能帮助那些需要这些内容的同行或刚入行的小伙伴,你的每次 点赞、分享 都是我继续创作下去的动力,我希望能在推广 python 技术的道路上尽我一份力量,欢迎在评论区向我提问,我都会一一解答,记得一键三连支持一下哦!
加入python学习交流微信群,请后台回复「入群」
本文分享自微信公众号 - python编程军火库(PythonCoder1024)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。