如何在PyQt中以分层方式管理多个异常

时间:2019-06-02 03:27:40

标签: python exception pyqt5

我想知道如何在pyqt中管理多个异常

我有一个函数'encodeVideo()',该函数可能会触发多个异常。

def updateFilename(self):
    try:
        self.model.updateFilename(self.fileName)
    except type_exc.PathIsEmpty as e:
        self.errorDialog.errorTypeChanged(e)
        self.errorDialog.show()

def updateOutput(self):
    try:
        self.model.updateOutput(self.encodeDialog.output)
    except (type_exc.FileAlreadyExists,  type_exc.PathNotExists) as e:
        self.errorDialog.errorTypeChanged(e)
        self.errorDialog.show()

def encodeVideo(self):
    self.updateFilename()
    self.updateOutput()

就我而言,很可能会触发updateFilname()updateOutput中的错误。发生这种情况时,将显示一个对话框并报告这两个错误。我打算对多个异常进行“优先排序”。例如,当两个函数的错误都发生时,它仅报告updateFilename()中的错误。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您希望在方法调用堆栈中尽可能多地处理异常;这通常意味着在第一次调用的用户界面中处理异常,如果在您的任何方法内部都发生了异常,您需要执行一些操作,则应捕获并重新抛出该异常,以下是一些示例:

在您的代码中,从UI调用的第一个方法是encodeVideo,因此,您要在此处捕获并处理异常:

def updateFilename(self):
    self.model.updateFilename(self.fileName)

def updateOutput(self):
    self.model.updateOutput(self.encodeDialog.output)

def encodeVideo(self):
    try:
        self.updateFilename()
        self.updateOutput()
    except (type_exc.PathIsEmpty, type_exc.FileAlreadyExists,  type_exc.PathNotExists) as e:
        self.errorDialog.errorTypeChanged(e)
        self.errorDialog.show()

抛出异常

让我们想象一下,如果对updatedOutput的调用失败,您想要做一些特定的事情,在这种情况下,您可以在inner方法中处理该异常,但是您应该再次抛出该异常,以便由调用方法:

def updateOutput(self):
    try:
        self.model.updateOutput(self.encodeDialog.output)
    except type_exc.FileAlreadyExists, e:
        print("Do something")
        raise type_exc.FileAlreadyExists(e)

def encodeVideo(self):
    try:
        self.updateFilename()
        self.updateOutput()
    except (type_exc.PathIsEmpty, type_exc.FileAlreadyExists,  type_exc.PathNotExists) as e:
        self.errorDialog.errorTypeChanged(e)
        self.errorDialog.show()

答案 1 :(得分:-1)

这基本上是一个异常和错误处理问题。因此,如果任何块中都存在错误,则系统会将其视为错误句柄或异常句柄。因此,如果第一个代码块给出了error,则下一个代码块包含另一个处理程序异常,因此系统将其视为错误和异常块非常简单。希望这对您有所帮助,也希望您的反馈意见得到赞赏。