Python Execnet及其异常处理

2024-09-23 14:34:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用execnet从python脚本中调用jython模块。在

docs

Note that exceptions from the remotely executing code will be reraised as channel.RemoteError exceptions containing a textual representation of the remote traceback.

假设我的远程模块可能导致两个不同的异常,我希望能够以不同的方式处理每个异常。如果两个异常都将引发一个仅包含一个回溯字符串的RemoteError异常,我将如何处理这一问题?在

例如,这个特定的调用代码:

#...
channel.send('bogus')

结果如下RemoteError,它只包含一个属性formatted,该属性包含一个回溯字符串:

^{2}$

我不能做try ... except IOError:。我可以做一个try ... except RemoteError as ex:并解析ex.formatted,看看它是否包含IOError,然后再将其引发,但这看起来相当草率:

from execnet.gateway_base import RemoteError
try:
    channel.send('bogus')
except RemoteError as ex:
    if 'IOError' in ex.formatted:
        raise IOError(ex.formatted[ex.formatted.find('IOError'): -1])
    if 'ValueError' in ex.formatted:
        raise ValueError(ex.formatted[ex.formatted.find('ValueError'): -1])
    # otherwise, reraise the uncaptured error:
    raise ex

Tags: 模块thefromaschannelexceptionsexraise
1条回答
网友
1楼 · 发布于 2024-09-23 14:34:17

一个老问题-我试着回答

import unittest
from execnet.gateway_base import RemoteError
import execnet

class Test(unittest.TestCase):

    def RemoteErrorHandler(self,error):
        e,t = error.formatted.splitlines()[-1].split(':')
        raise getattr(__builtins__,e)(t)

    def raising_receive(self, ch):
        try:
            return ch.receive()
        except RemoteError as ex:
            self.RemoteErrorHandler(ex)

    def setUp(self):
        self.gateway = execnet.makegateway()


    def test_NameError(self):
        ch = self.gateway.remote_exec("print o")
        with self.assertRaises(NameError):
            self.raising_receive(ch)


if __name__ == '__main__':
    unittest.main()

相关问题 更多 >