首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 工匠: 异常处理的三个好习惯

继续阅读前,我希望你已经了解了下面这些知识点:异常的基本语法与用法(建议阅读官方文档 “Errors and Exceptions”)为什么要使用异常代替错误返回(建议阅读《让函数返回结果的技巧》)为什么在写...所以在代码里,我们用一个大大的 try...except 语句块,将这几个步骤都包裹了起来。安全第一。那么,这段看上去简洁易懂的代码,里面藏着什么问题呢?...为什么呢?问题就藏在这个硕大无比的 try...except 语句块里。假如你把眼睛贴近屏幕,非常仔细的检查这段代码。...我看到了一段让我非常纠结的代码:图片process_image 函数尝试解析一个文件对象,如果该对象不能被作为图片正常打开,就抛出 error_codes.INVALID_IMAGE_UPLOADED...但在现实世界中,如果你严格遵循这些流程,那么很有可能碰上另外一个问题:异常处理逻辑太多,以至于扰乱了代码核心逻辑。

68410
您找到你想要的搜索结果了吗?
是的
没有找到

Python 工匠: 异常处理的三个好习惯

继续阅读前,我希望你已经了解了下面这些知识点: 1.异常的基本语法与用法 2.为什么要使用异常代替错误返回 3.为什么在写 Python 时鼓励使用异常 只做精准的异常捕获 假如你不够了解异常机制,就难免会对它有一种天然恐惧感...所以在代码里,我们用一个大大的 try...except 语句块,将这几个步骤都包裹了起来。安全第一 。 那么,这段看上去简洁易懂的代码,里面藏着什么问题呢?...为什么呢? 问题就藏在这个硕大无比的 try...except 语句块里。假如你把眼睛贴近屏幕,非常仔细的检查这段代码。...但在现实世界中,如果你严格遵循这些流程,那么很有可能碰上另外一个问题:异常处理逻辑太多,以至于扰乱了代码核心逻辑。...最后再总结一下要点: 1.只捕获可能抛出异常的语句,避免含糊的捕获逻辑 2.保持模块异常类的抽象一致性,必要时对底层异常类进行包装 3.使用“上下文管理器”可以简化重复的异常处理逻辑   -python

73140

Python 工匠: 异常处理的三个好习惯

为什么在写 Python 时鼓励使用异常 (建议阅读 “Write Cleaner Python: Use Exceptions”) 三个好习惯 1....所以在代码里,我们用一个大大的 try...except 语句块,将这几个步骤都包裹了起来。安全第一 ⛑。 那么,这段看上去简洁易懂的代码,里面藏着什么问题呢?...为什么呢? 问题就藏在这个硕大无比的 try...except 语句块里。假如你把眼睛贴近屏幕,非常仔细的检查这段代码。...APIErrorCode 异常类的意义,在于表达一种能够直接被终端用户(人)识别并消费的“错误代码”。它在整个项目里,属于最高层的抽象之一。但是出于方便,我们却在底层模块里引入并抛出了它。...但在现实世界中,如果你严格遵循这些流程,那么很有可能碰上另外一个问题:异常处理逻辑太多,以至于扰乱了代码核心逻辑。

88130

别再乱用 try except 了...

Python 把问题暴露出来。通过 Python 的报错,你可以直接看到是哪一行代码有问题,具体是什么问题。 甚至有时候,不仅不需要捕获异常,你还应该主动抛出异常。...在项目完成以后,如果你做的是一个第三方库,是用来给别人调用的,那么,你应该多抛出异常,而不是擅自返回一个普通的错误信息。...只要 user_id不是整型,就抛出AssertionError。 我们直接执行python3 xxx.py时,这些断言语句正常工作。...这些异常你知道它为什么会出现,并且你知道应该怎么解决它。 例如,我们使用requests请求网站,由于网络问题,有时候可能请求超时。一旦超时 requests 就会抛出超时异常,如下图所示: ?...成功把异常所在的行数和具体的错误类型打印了出来。显然,这样写你需要平白无故多写很多代码。 总结 try...except...让你的代码看起来没有问题,但也有可能掩盖问题,让你无法发现哪里有问题。

1.1K20

Python 工匠:异常处理的三个好习惯

为什么在写 Python 时鼓励使用异常 (建议阅读 “Write Cleaner Python: Use Exceptions”) 三个好习惯 1....所以在代码里,我们用一个大大的 try ... except 语句块,将这几个步骤都包裹了起来。安全第一 ⛑。 那么,这段看上去简洁易懂的代码,里面藏着什么问题呢?...为什么呢? 问题就藏在这个硕大无比的 try ... except 语句块里。假如你把眼睛贴近屏幕,非常仔细的检查这段代码。...APIErrorCode 异常类的意义,在于表达一种能够直接被终端用户(人)识别并消费的“错误代码”。它在整个项目里,属于最高层的抽象之一。但是出于方便,我们却在底层模块里引入并抛出了它。...但在现实世界中,如果你严格遵循这些流程,那么很有可能碰上另外一个问题:异常处理逻辑太多,以至于扰乱了代码核心逻辑。

58840

三个好习惯,帮你写好Python里的异常处理

为什么在写 Python 时鼓励使用异常 (建议阅读 “Write Cleaner Python: Use Exceptions”) 三个好习惯 1....所以在代码里,我们用一个大大的 try...except 语句块,将这几个步骤都包裹了起来。安全第一 ⛑。 那么,这段看上去简洁易懂的代码,里面藏着什么问题呢?...如果你旁边刚好有一台安装了 Python 的电脑,那么你可以试着跑一遍上面的脚本。你会发现,上面的代码是不能成功执行的。...为什么呢? 问题就藏在这个硕大无比的 try...except 语句块里。假如你把眼睛贴近屏幕,非常仔细的检查这段代码。...但在现实世界中,如果你严格遵循这些流程,那么很有可能碰上另外一个问题:异常处理逻辑太多,以至于扰乱了代码核心逻辑。

1.1K20

一文搞懂Python异常错误

为什么我要写这篇呢,之前有很多小伙伴在运行代码时遇到了各种各样的问题,甚至有这样的一句话,编程一小时,找错一整天,所以小卡今天就整理了一下日常常见的几种报错类型,come~ 首先我们来说一下错误和异常,...什么是异常呢,异常就是程序运行时,某一句引发错误导致之后的代码都无法运行,是不是有点丛林大盗的感觉,此山是我开,此树是我栽,哎呀呀~ 在Python无法正常处理程序时就会发生一个异常。...这里的异常Python对象,表示这段代码是这个问题。...Python在执行程序时,检测到错误,触发异常,在异常触发后且没有处理的情况下,程序立即在当前异常处停止,后面的代码就不会运行,那么我们的程序就会直接崩溃,弱不禁风,所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性...,却不想彻底解决这个异常,而是将该异常向上层抛出,可以使用raise关键字 raise用于抛出异常,其后可以跟一个异常对象,或者什么也不跟,如下: raise 加一个异常对象: raise Exception

76810

effective C++ 读书笔记 条款08「建议收藏」

条款08 别让异常逃离析构函数: 假设在析构函数其中发生了异常,程序可能过早结束或者导致不明白行为(异常从析构函数传播出去) 看代码: #include using namespace...) { abort();//假设一个程序遭遇一个“于析构期间发生的错误”后无法继续同意,强迫结束是个合理的选择。...提示一个程序已经停止工作(感觉这里编译器优化到解决方式1了,自己主动做了处理),假设不停止工作。也出现了不明白行为。採用解决方式1:执行程序,提示一个debug error,终止程序。...总结: 1:析构函数绝对不要吐出异常,假设一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉该异常,然后吞下它们(不传播)或结束程序 2:假设客户须要对某个操作函数执行期间抛出的异常做出反应,那么...假设一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉该异常。

25130

Python进阶|聊聊异常处理

前言 在编写代码中,总会遇到一些bug和报错,怎么去捕获这些异常,并进行处理,以让程序更健硕了?本篇文章将带你聊聊Python的异常处理。...语法错误很好理解,就是我们写的代码不符合Python代码的规范,导致程序无法识别和运行,比如下面这个例子: def add(a,b) print(a+b) add(1,2) #SyntaxError...try: 尝试运行程序 出现异常后这段代码就不会运行 except 错误类 as e: 发生异常运行这部分代码 我们就拿0不能作为分母来进行演示: try: a = 1/...0不能为分母的错误,那NameError为什么没有被捕捉到了?...主动抛出异常 我们可以通过raise语句主动抛出异常,其用法为:raise 后跟要抛出的异常。这个异常必须是异常实例或者是一个异常类。

58730

那些程序员写过的超搞笑56个代码注释(值得收藏)!!

* total_hours_wasted_here = 73 * 亲爱的维护者 如果尝试对这段程序进行'优化' 并且您已经意识到这是一个多么可怕的错误, 请增加以下计数器的个数用来对后来人进行警告...一旦你调试了,你绝对会后悔装聪明去尝试优化这段代码。 最好的方式是关闭文件, 去玩点儿你喜欢的东西吧!...如果这段代码停止工作时还在使用, 杀了我吧,哦~你不能这么做 我死了...... 34. // If you are reading this, that means you have been put...这段代码以前是有效的,但是我的猫决定在我的键盘上跑一趟 37. long long ago; / in a galaxy far far away / 在很远很远的银河系外 (这段代码能运行,绝对是个奇迹...这是垃圾代码,但现在是凌晨3点,我需要让他能够正常运行 Python进阶笔记、最新面试复习笔记PDF,我的GitHub 文末 对文章有何见解,或者有何技术问题,欢迎在评论区一起留言讨论!

1.3K40

Python编程思想(32):异常处理中的try…except

现在绝大多数编程语言都支持异常处理,异常处理的通行做法是将正常执行的代码放在特定代码块中,然后再将处理异常的代码放在另一个代码块中,如果正常执行的代码块的某条语句抛出了异常,那么就会直接跳到处理异常的代码块中继续执行...,但对于一个程序所抛出错误数量是未知的,所以通过条件很可能无法处理所有的错误,为了尽可能处理所有的错误,可以使用Python语言的try...except语句,该语句可以捕获各种异常。...当程序运行出现意外情况时,系统自动生成一个Error对象来通知程序,从而实现将“业务实现代码”和“错误处理代码”分离,提供更好的可读性。...在这段代码的try.except语句中,包含了用于输入分子和分母的代码。...当输入的分母为0时,抛出异常,也就是执行except块中的代码,过程如下: 请输入分子:20 请输入分母:0 分母不能为0,请重新输入分母!

77320

Python(八)

Python(八) 發佈於 2019-04-15 本篇,我们说说 Python 中的错误处理机制(Error Handler)。...,就可以用 try 来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即 except 语句块,执行完 except 后,如果有 finally 语句块,则执行 finally...,可以在 except 语句块后面加一个 else,当没有错误发生时,自动执行 else 语句: try: print('try...')...抛出错误 因为错误是 class,捕获一个错误就是捕获到该 class 的一个实例。Python 的内置函数抛出很多类型的错误,我们自己编写的函数也可以抛出错误。...raise bar() 在 bar() 函数中,我们明明已经捕获了错误,但是,打印一个 ValueError! 后,又把错误通过 raise 语句抛出去了,捕获错误目的只是记录一下,便于后续追踪。

31020

Python之异常处理

Python之异常处理 1 Python中的错误处理 在程序运行的过程中,难免会出现这样那样的错误,有些错误是我们自己程序编写上有问题,也就是程序员听了砍人的那句话,"哟,写bug呢!"...,可以使用try来运行这段代码,这样做的好处是,如果这段代码真的存在错误,则后续的代码不会执行,而是直接跳转至错误处理代码,也就是except模块,执行完except之后,如果有finally语句,则执行...如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。...3 抛出错误Python中,每一个错误都是一个class,所有的错误类型都继承自BaseException,在使用except的时候需要注意,它不但不获该类型的错误,还把其子类的错误一网打尽。...捕获一个错误就是捕获该class的一个实例,Python内置的函数抛出很多类型的错误,如果我们想自己自定义一个错误,可以使用下面的方法: # err_raise.py class FooError(ValueError

45310

我去,你竟然还在用 try–catch-finally

不用写注释都能明白这段代码是干嘛的:在 try 块中读取文件中的内容,并一行一行地打印到控制台。如果文件找不到或者出现 IO 读写错误,就在 catch 中捕获并打印错误的堆栈信息。...但是呢,有经验的读者从上面这段代码中发现 2 个严重的问题: 1)文件名“牛逼.txt”包含了中文,需要通过 java.net.URLDecoder 类的 decode() 方法对其转义,否则这段代码在运行时铁定要抛出文件找不到的异常...但如果你对“整洁”这个词心生向往的话,感觉这段代码非常臃肿,尤其是 finally 中的代码,就好像一个灌了 12 瓶雪花啤酒的大肚腩。...况且,try–catch-finally 至始至终存在一个严重的隐患:try 中的 br.readLine() 有可能抛出 IOException,finally 中的 br.close() 也有可能抛出...我们在 try () 中只是 new 了一个 MyResource 的对象,其他什么也没干,但偏偏 close() 方法中的输出语句执行了。想要知道为什么吗?来看看反编译后的字节码吧。

1.2K10

13 年的 Bug 调试经验总结

这是我们思考的不足,没有考虑到有时候事情过早发生。 3.悄无声息的故障。一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误代码所导致的。...例如,没有检查代码却返回错误的系统调用(如bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。在错误状态中持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。...确保补充足够多的(但不要太多)日志记录,这样你就可以说明为什么程序要这么做。如果一切正常,那也没关系,但要是有问题发生,你很庆幸自己添加了这些日志。...10.错误处理。处理错误代码往往是难以测试的。最好有能检查错误处理代码的自动测试,但有时这是不可能的。我有时会使用的一招是临时修改代码,使得错误处理代码运行起来。...当曾经可以正常工作的东西停止工作,那么这通常是因为最近改变的东西所导致的。在一个案例中,最近的改变只是日志记录,但是日志中的错误却导致了一个更大的问题。

71850

Python3 错误和异常

作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们专门介绍。 Python有两种错误很容易辨认:语法错误和异常。...语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 ? Python3 错误和异常 这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号(:)。...一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如: ? Python3 错误和异常 ? Python3 错误和异常 ?...这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上: for line in open("myfile.txt"): print(line, end="") 以上这段代码的问题是,当执行完毕后,...语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法: with open("myfile.txt") as f: for line in f: print(line, end="") 以上这段代码执行完毕后

87420
领券