如果在Python中的类内引发任何异常,请与服务器断开连接

时间:2018-09-06 15:18:11

标签: python class exception

我正在运行一个用PyQt制作的应用程序,该应用程序基本上是从OPC服务器读取信息,并在每次输入新数据时更新绘图。

我希望能够在每次关闭应用程序时安全地与OPC服务器断开连接。这包括用户手动关闭窗口 和可能发生的任何运行时错误。会是这样的:

from opcua import Client
from matplotlib.backends.qt_compat import QtWidgets

class ApplicationWindow_Realtime(QtWidgets.QMainWindow):      
    def __init__(self, parent=None):
        super(ApplicationWindow_Realtime, self).__init__(parent)
        self.opc_url = 'opc.tcp://127.0.0.1:53530/UA/Sim'
        self.opc_initialize()

        ## DO STUFF

    ## Connect to OPC
    def opc_initialize(self):
        self.client = Client(self.opc_url)
        self.client.connect()

    ## OTHER METHODS

    # Disconnect if window is closed
    def closeEvent(self, event):
        self.client.disconnect()

我想知道如果运行应用程序时运行时发生任何错误,是否可以通过某种方式调用self.client.disconnect()。我找到了this question,但是接受的答案开始于“警告:如果您想要这样的话,可能您不想要……但如果您真的想要……”,所以我不确定是否这是解决问题的正确方法。

1 个答案:

答案 0 :(得分:0)

我会做一些与您链接的答案类似的事情,但是会在类本身中定义它。

from functools import wraps

def _emergency_disconnect(the_func):
    @wraps(the_func)
    def wrapper(*args, **kwargs):
        output = None
        try:
            output = the_func(*args, **kwargs)
        except:
            #args[0] will always be self
            args[0].client.disconnect()
        if output != None:
            return output
    return wrapper

然后您可以用它装饰功能

@_emergency_disconnect
def myFunction(myArg):
    pass

每当方法调用导致错误时,这将导致self.client.disconnect()被调用。