在 Python 中引发特定异常

Raising specific exceptions in Python

我有 Python 代码将 XML 解析为 JSON。虽然它工作正常,但我希望通过引发一些异常来使其更加健壮。这是我当前的代码:

    result['answer'].append({
        'multiplier': int(element.findall(r'Multiplier')[0].text), # This is an int
        'enabled': bool(element.attrib['enabled']), # This is bool
        'symbols': sym
    })

在上面的代码中,我想提出:XMLBooleanParsingError() 如果我们不能将 element.attrib['enabled'] 解析为 bool 和 XMLIntegerParsingError()如果我们无法解析第 2 行。

我尝试了多种方法,例如:

result['answer'].append({
    'multiplier': int(element.findall(r'Multiplier')[0].text), # This is an int
    try:
        'enabled': bool(element.attrib['enabled'])
    except:
        raise XMLBooleanParsingError()
    'symbols': sym
})

但是我遇到了错误。我想在 JSON 中存储结果时捕获异常。有哪些方法可以遵循?

TL;DR:最简单的解决方案可能是创建 parse_intparse_bool 函数,它们会抛出 XMLBooleanParsingError。

Python 没有您尝试使用的语法,我什至不确定您是否可以在 lambda 中编写 try/catch 块。幸运的是,您可以在任何地方定义函数,所以这应该不是问题。

def parse_int(s: str) -> int:
    try:
        return int(s)
    except ValueError as ex:
        raise XMLIntParsingError from ex # gives more verbose and comprehendible exception message

附带说明一下,bool(s) 很可能不是您想要解析 bool 的方式,因为 bool("false") == Truebool("0") == True.

你不能那样使用 try-except。附加命令需要在 try-except 的“try”块中,而不是在字典定义中。

try:
    result['answer'].append({
        'multiplier': int(element.findall(r'Multiplier')[0].text), 
        'enabled': bool(element.attrib['enabled']),
        'symbols': sym
    })
except:
    raise XMLBooleanParsingError()

我觉得还是分开解析参数比较好,看解析过程中有没有抛出异常,只有成功才插入字典

如果您希望每次解析都有单独的异常,这是更好的方法:

try:
    multi = int(element.findall(r'Multiplier')[0].text)
except exception as e:
    raise [your exception]()
try:
    enable = bool(element.attrib['enabled'])
except exception as e:
    raise [your exception]()
result['answer'].append({
    'multiplier':multi  , // This is an int
    'enabled': enable , // This is bool
    'symbols': sym
})

您可以一次性完成,但您需要知道您要捕获的异常是什么:

try:
    multi = int(element.findall(r'Multiplier')[0].text)
    raise [your exception]()
    enable = bool(element.attrib['enabled'])
    result['answer'].append({
    'multiplier':multi  , // This is an int
    'enabled': enable , // This is bool
    'symbols': sym
    })
except [first exception] as e:
    raise [your exception]()
except [second exception] as e:
    raise [your exception]()