Saya bertanya-tanya bagaimana cara mengelola banyak pengecualian di pyqt

Saya memiliki fungsi 'encodeVideo()' yang dapat memicu beberapa pengecualian.

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()

Dalam kasus saya, kemungkinan akan memicu kesalahan baik di updateFilname() dan updateOutput. Ketika ini terjadi, sebuah dialog akan muncul dan melaporkan kedua kesalahan tersebut. Namun, sepertinya saya mengelola pengecualian dengan cara yang salah. Misalnya, ketika kesalahan dalam self.updateFilename() terjadi, itu tidak menghentikan kode saya untuk melanjutkan kode berikutnya self.updateOutput().

0
yujuezhao 2 Juni 2019, 06:27

2 jawaban

Jawaban Terbaik

Anda ingin menangani pengecualian setinggi mungkin di tumpukan panggilan metode Anda; ini biasanya berarti bahwa pengecualian ditangani di UI tempat panggilan pertama dilakukan, jika di dalam salah satu metode Anda, Anda perlu melakukan sesuatu jika pengecualian terjadi, Anda harus menangkap dan melemparkan kembali pengecualian, berikut beberapa contohnya:

Dalam kode Anda, metode pertama yang dipanggil dari UI adalah encodeVideo, oleh karena itu, Anda ingin menangkap dan menangani pengecualian Anda di sana:

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()

Tampilkan kembali pengecualian

Mari kita bayangkan jika panggilan ke updatedOutput gagal, Anda ingin melakukan sesuatu yang spesifik, dalam hal ini, Anda dapat menangani pengecualian dalam metode dalam, tetapi Anda harus mengulanginya lagi sehingga ditangani oleh metode panggilan:

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
Isma 3 Juni 2019, 19:38

Ini pada dasarnya adalah pengecualian dan masalah penanganan kesalahan. Dan karenanya jika ada kesalahan di blok apa pun maka sistem menganggapnya sebagai pegangan kesalahan atau pegangan pengecualian. Jadi jika blok kode pertama memberikan error , maka blok berikutnya berisi pengecualian handler lain sehingga sangat sederhana bahwa sistem memperlakukannya sebagai blok kesalahan dan pengecualian.

-1
Dharman 25 Januari 2020, 13:06