别再乱用 try except 了...

2024-05-15 13:38
文章标签 try except

本文主要是介绍别再乱用 try except 了...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阅读本文大概需要 3 分钟。

有不少人在写 Python 代码时,喜欢用 try...except Exception,更有甚者一层套一层,不管有没有用,先套了再说:

def func():try:"函数内部代码"except Exception as e:print('函数错误:', e)try:func()
except Exception as e:print('函数错误:', e)

根本不管是否有必要,总之套上了try...except...就有了安全感。

俄罗斯套娃套多了以后,噩梦开始了。我们来看看下面这段报错:

你倒是给我说说,是哪个函数出了问题?

如果你饱受滥用try...except...之苦,下面三个方法可以让你脱离苦海。

把问题暴露出来

在程序开发的初期,不要用try...except...。让 Python 把问题暴露出来。通过 Python 的报错,你可以直接看到是哪一行代码有问题,具体是什么问题。

甚至有时候,不仅不需要捕获异常,你还应该主动抛出异常。在项目完成以后,如果你做的是一个第三方库,是用来给别人调用的,那么,你应该多抛出异常,而不是擅自返回一个普通的错误信息。

例如,你要实现一个函数:query_name,传入参数是数字 id,输出用户名。你可能会这样写:

def query_name(user_id):if not isinstance(user_id, int):return {'success': False, 'msg': '用户 id 必须是整型'}...

但实际上,更好的做法是,直接抛出一个异常:

def query_name(user_id):if not isinstance(user_id, int):raise Exception('用户 id 必须是整型'}...

甚至在某些情况下,你可以使用 Python 的断言

def query_name(user_id):assert isinstance(user_id, int), '用户 id 必须是整型'...

如下图所示:

只要 user_id不是整型,就抛出AssertionError

我们直接执行python3 xxx.py时,这些断言语句会正常工作。但我们可以通过python3 -O xxx.py来让所有assert xxx语句失效。

尽量早地让异常暴露出来,才能更早地解决问题。

捕获具体异常而不是所有异常

只捕获你明确知道的异常。这些异常你知道它为什么会出现,并且你知道应该怎么解决它。

例如,我们使用requests请求网站,由于网络问题,有时候可能会请求超时。一旦超时 requests 就会抛出超时异常,如下图所示:

这种情况下,你知道这个地方可能会出现Timeout异常,并且你知道出现的时候,重试就可以了。于是,你可以捕获这个异常:

大家注意,在这个地方,requests 执行了.json()方法。如果URL 返回的内容可能不是 JSON 格式的字符串,这里就会报JSONDecodeError,如下图所示:

如果你不做区分,一股脑直接用 except Exception,那么你怎么知道,到底是你能够正常处理的超时问题,还是你不能正常处理的网站内容返回异常?

所以,只捕获你知道它为什么会发生并且你知道如何处理的异常。对于你无法预料的或者无法处理的异常,直接抛出。不要擅自捕获。

强行打印报错信息

如果实在是万不得已,你必须用try...except Exception,如何把具体报错的位置打印出来呢?其实也是有方法的。那就是使用 Python 自带的traceback模块。

它的用法非常简单:

import tracebacktry:1 + 'a'
except Exception:print(traceback.format_exc())

运行效果如下图所示:

成功把异常所在的行数和具体的错误类型打印了出来。显然,这样写你需要平白无故多写很多代码。

总结

try...except...会让你的代码看起来没有问题,但也有可能会掩盖问题,让你无法发现哪里有问题。所以,从看了这篇文章开始,删除不必要的try...except...

拥抱异常,让你无法处理的异常抛出来。程序出现了问题应该停止运行,而不是带着问题继续运行,这样可能会演变成更大的问题。

好文和朋友一起看~

这篇关于别再乱用 try except 了...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991971

相关文章

C++第四十七弹---深入理解异常机制:try, catch, throw全面解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】 目录 1.C语言传统的处理错误的方式 2.C++异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3 异常安全 3.4 异常规范 4.自定义异常体系 5.C++标准库的异常体系 1.C语言传统的处理错误的方式 传统的错误处理机制:

try -catch-finally的理解,同时在try-catch-finally中含有return和throws的理解

在没有try-catch或try-catch-finally的情况下,程序正常执行到某行,在这行报错后,这行后面的代码就不执行了,程序就停止了,中断了。 例如   在有try-catch或try-catch-finally 情况上,在某行执行错误,在try中这行下的代码不执行,try外的代码执行。当然是catch在没有做处理的情况下。如果catch中做了处理,在不影响当前程序下,try

[LeetCode] 238. Product of Array Except Self

题:https://leetcode.com/problems/product-of-array-except-self/description/ 题目 Given an array nums of n integers where n > 1, return an array output such that output[i] is equal to the product of all

mysql Deadlock found when trying to get lock; try restarting transaction

一、现场情况 sql:insert into a ...... 数据库隔离级别:read-committed 表a有唯一索引 二、死锁发生的4个必要条件 1、互斥条件(Mutual Exclusion):资源独享 2、占有并等待条件(Hold and Wait):占有资源并等待其他资源 3、非抢占条件(No Preemption):占有的资源不可以被剥夺,只能主动释放 4、循环等待

C++异常处理: try,catch,throw,finally的用法

写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要.  内容导读本文包括2个大的异常实现概念:C++的标准异常和SEH异常. C++标

[置顶]C++异常处理:try,catch,throw,finally的用法

写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要.  内容导读本文包括2个大的异常实现概念:C++的标准异常和SEH异常. C++标

ES6中try-catch

在ES6(ECMAScript 2015)中,try-catch 语句的语法和使用方式与在之前的ECMAScript版本中是一样的。try-catch 语句用于处理代码中可能发生的错误,确保程序的健壮性和用户体验。 基本语法 try { // 尝试执行的代码块 // 如果发生错误,则执行 catch 块中的代码 } catch (error) { // 处理错误 // error

【C++】try 语句捕获异常,catch子句处理异常

#include <iostream>#include <stdexcept>using namespace std;int main(){int i1, i2;while(cin >> i1 >> i2){try{if (i2 == 0)throw runtime_error("分母为0!");cout << "i1除以i2的结果是: " << i1/i2 << endl;}catch(ru

try-catch-finally中finally的使用

1.finally时可选的 2.finally中声明的时一定会被执行的代码,即使catch中又出现异常了,try中有return语句,catch中有return语句的情况 3.像数据库连接,输入输出流,网络编程Socket等资源,JVM时不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

try里面放return,finally还会执行吗?

引言 喜欢请点赞,支持点在看。 关注牛马圈,干货不间断。 趣聊 今天,在与同事讨论编程语言特性时,我们谈到了一个有趣的话题:在JavaScript中,finally块中的return语句是否会覆盖try块中的return。我首先通过网络搜索,发现关于这一问题的讨论颇多,其中一篇关于JavaScript的文章尤为引人关注。以下是该文章的部分内容截图: ❝ 文章指出,在JavaScript中