Как правильно управлять исключениями в PyQt - PullRequest
0 голосов
/ 02 июня 2019

Мне интересно, как управлять несколькими исключениями в 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. Когда это произойдет, появится диалоговое окно и сообщит об обеих ошибках. Однако я, похоже, неправильно управляю исключениями. Например, когда возникает ошибка в self.updateFilename(), это не мешает моему коду продолжать следующий код self.updateOutput().

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы хотите обрабатывать исключения как можно выше в вашем стеке вызовов методов;это обычно означает, что исключения обрабатываются в пользовательском интерфейсе, где был сделан первый вызов, если внутри какого-либо из ваших методов вам нужно что-то делать, если возникает исключение, вы должны перехватить и повторно выбросить исключение, вот несколько примеров:

В вашем коде первым методом, который вызывается из пользовательского интерфейса, является 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 завершится неудачно, вы захотите сделать что-то конкретное, в этом случае вы можете обработать исключение во внутреннем методе, но вы должны снова сбросить его, чтобы оно былообрабатывается методом вызова:

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()
0 голосов
/ 03 июня 2019

Это в основном проблема исключения и обработки ошибок.И, следовательно, если в каком-либо блоке есть ошибка, система воспринимает ее как обработчик ошибок или исключений.Таким образом, если первый блок кода дал ошибку, то следующий блок содержит еще одно исключение обработчика, поэтому система очень просто воспринимает его как блоки ошибок и исключения.Я надеюсь, что это поможет вам, и ваше мнение будет оценено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...