在Python中,哪些异常应该捕获,哪些不应该捕获

在Python中,哪些异常应该捕获,哪些不应该捕获,python,exception,exception-handling,structure,Python,Exception,Exception Handling,Structure,例如,我有一个具有以下结构的程序: 域逻辑模块->设置模块->设置存储后端 接下来是设置模块的一部分 def load_from_json(self, json_str): try: self.load_from_dict(json.loads(json_str)) except ValueError as e: raise SettingsLoadDataException('Error loading json') 我需要一个自定义异常设置s

例如,我有一个具有以下结构的程序:

域逻辑模块->设置模块->设置存储后端

接下来是设置模块的一部分

def load_from_json(self, json_str):
    try:
        self.load_from_dict(json.loads(json_str))
    except ValueError as e:
        raise SettingsLoadDataException('Error loading json')
我需要一个自定义异常设置sloaddataexception,或者我可以跳过捕捉json.loads错误

def load_from_json(self, json_str):
    self.load_from_dict(json.loads(json_str))
更新。

另一个好的变体是:

def load_from_json(self, json_str):
    try:
        self.load_from_dict(json.loads(json_str))
    except ValueError as e:
        raise ValueError('Error loading json')

这是一个只有你才能回答的问题。您可以捕获所有异常,或者如果程序抛出一个您无法处理的异常,您可以让程序崩溃。如果程序不崩溃至关重要,那么捕获异常。但是,您应该实现一种恢复方法。如果Json加载不正确,没有它您的程序能做任何有用的事情吗?如果可以,我将捕获异常,否则您可以显示一个错误并终止。

您应该以这样的方式处理异常,即看到堆栈跟踪可以立即向您解释问题

我不是Python专家,但您是否会泄漏一条信息,即实际上是ValueError导致了程序崩溃?在跟踪中只会看到SettingsLoadDataException,而没有任何真正的原因,对吗


此外,如果您不重新抛出异常,您应该只捕获那些您知道如何处理的异常。让程序崩溃总比让它处于意外状态要好。

是的,我担心堆栈跟踪。在python中,可以使用不同的异常重新刷新原始堆栈跟踪,但它看起来像一辆丑陋的自行车。但有时我并不需要完整的stacktrace:在head中的示例中,我不想知道原始异常发生在哪里,我只想知道存在ValueError(“无效json”)。我需要一个自定义设置SloaddataException或只使用一个ValueError更具pythonic吗?@PavelPatrin思考一下,对于调试来说,应该是非常清晰的,而不是“pythonic”: