如何单独捕获这些异常?

dot*_*hen 4 python quickbooks exception

我正在编写一个与Quickbooks接口的Python程序。连接到Quickbook时,根据问题,我可能会遇到以下两种常见异常之一:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'QBXMLRP2.RequestProcessor.2', 'The QuickBooks company data file is currently open in a mode other than the one specified by your application.', None, 0, -2147220464), None)

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'QBXMLRP2.RequestProcessor.2', 'Could not start QuickBooks.', None, 0, -2147220472), None)
Run Code Online (Sandbox Code Playgroud)

捕获通用异常时except Exception as e显示的类型e<class 'pywintypes.com_error'>,不能用于捕获异常:

... catch pywintypes.com_error as e:
NameError: global name 'pywintypes' is not defined
Run Code Online (Sandbox Code Playgroud)

那么,如何以一种非通用的方式捕获这两个异常呢?理想情况下,代码应具有以下布局:

try:
    qb = qbsdk_interface.Qbsdk_Interface(QB_FILE)

except QbWrongModeError as e:
    print('Quickbooks is open in the wrong mode!')

except QbClosedError as e:
    print('Quickbooks is closed!')

except Exception as e:
    print('Something else went wrong!')
Run Code Online (Sandbox Code Playgroud)

当然,异常QbWrongModeErrorQbClosedError不存在,那么在它们的位置应该有什么?

jiz*_*AMA 10

现在pywintypes.errorBaseException

没有必要from pywintypes import com_error

如果你想捕获这个异常。你可以抓住BaseException

except BaseException as e: # to catch pywintypes.error
    print(e.args)
Run Code Online (Sandbox Code Playgroud)

异常的格式是这样的:

(0, 'SetForegroundWindow', 'No error message is available')
Run Code Online (Sandbox Code Playgroud)

所以如果你想检查返回码,使用e.args[0]而不是e.exceptinfo[5]


dot*_*hen 5

我发布帖子后,就发现了一种以非通用方式捕获异常的方法,该异常出现在“相关”侧边栏中的一个问题中。这是捕获这些异常的方法:

from pywintypes import com_error

except com_error as e:
Run Code Online (Sandbox Code Playgroud)

请注意,无法单独处理导致异常的不同原因,因此必须except通过比较的值在子句中检查返回码e.exceptinfo[5]

except com_error as e:

    if e.excepinfo[5] == -2147220464:
        print('Please change the Quickbooks mode to Multi-user Mode.')

    elif e.excepinfo[5] == -2147220472:
        print('Please start Quickbooks.')

    else:
        raise e
Run Code Online (Sandbox Code Playgroud)

我曾考虑过将此问题标记为欺骗,但考虑到其他相关问题都无法处理区分在单一类型下引发的不同异常的情况,因此我在解决该问题并予以回答时将其保留。

  • 在某些版本的 pywintypes 中,“e.excepinfo”没有返回码,但“e.hresult”有。 (2认同)