在 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_int
和 parse_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") == True
和 bool("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]()
我有 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_int
和 parse_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") == True
和 bool("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]()