Python mengembalikan pengecualian dari fungsi

Kode pengguna dapat memunculkan pengecualian bawaan. Python mendefinisikan coba/kecuali untuk menangani pengecualian dan melanjutkan eksekusi program lebih lanjut tanpa gangguan

Mari kita segera ke contoh klausa coba/kecuali dasar

coba/kecuali pernyataan

Dengan asumsi file tidak tersedia, mengeksekusi kode di bawah ini akan memberikan output seperti yang ditunjukkan di bawah ini

try:
    f = open("testfile.txt")
    ...

except FileNotFoundError as e:
    print(f" Error while reading file {e} ")

Output:
Error while reading file [Errno 2] No such file or directory: 'testfile.txt'

Dalam kasus penggunaan praktis seperti menghubungkan ke db atau membuka objek file, kita mungkin perlu melakukan operasi teardown seperti penutupan db/penutupan file terlepas dari blok yang dijalankan. Jadi akhirnya adalah salah satu blok yang dapat dicadangkan untuk operasi ini karena selalu dijalankan. Mari kita lihat sebuah contoh

coba/kecuali/akhirnya pernyataan

try:
    f = open("testfile.txt")
except FileNotFoundError as e:
    print(f" Error while reading file {e} ")
finally:
    print(" Closing the file ")
    f.close()
_

Jadi apa yang mungkin salah di sini?

Yah, seseorang dapat dengan mudah menginjakkan kaki di mulut mereka ketika mereka menggunakan pernyataan kembali dengan coba/kecuali/akhirnya dengan Python. Mari berhati-hati mengambil langkah demi langkah untuk memahami penggunaan pernyataan pengembalian selama penanganan pengecualian

1. Penggunaan pengembalian dengan coba/kecuali

def test_func():
    try:
        x = 10
        return x
    except Exception as e:
        x = 20
        return x
    finally:
        x = 30
        return x

print(test_func())

Output:
30

Jika menurut Anda output dari kode di atas adalah 10, saya khawatir Anda salah. Cukup normal untuk membuat asumsi itu karena kita cenderung berpikir bahwa saat ada pernyataan pengembalian dalam suatu fungsi, maka ia kembali (keluar) dari fungsi tersebut. Yah, itu mungkin tidak benar dalam kasus ini

Dari dokumen,

  • Jika ada klausa akhirnya, klausa akhirnya akan dieksekusi sebagai tugas terakhir sebelum pernyataan try selesai. Klausa akhirnya berjalan apakah pernyataan try menghasilkan pengecualian atau tidak

  • Jika pernyataan try mencapai pernyataan istirahat, lanjutkan atau kembalikan, klausa akhirnya akan dieksekusi tepat sebelum eksekusi pernyataan istirahat, lanjutkan atau kembalikan

  • Jika klausa akhirnya menyertakan pernyataan pengembalian, nilai yang dikembalikan akan menjadi salah satu dari pernyataan pengembalian klausa akhirnya, bukan nilai dari pernyataan pengembalian klausa coba/kecuali

Jadi seperti yang Anda tebak dengan benar, output dari kode di atas adalah 30

Python mengembalikan pengecualian dari fungsi

Sekarang, apa yang terjadi jika pengecualian dimunculkan dalam kode yang disebutkan di atas

2. Penggunaan pengembalian dengan pengecualian

def test_func():
    try:
        x = 10
        raise Exception
    except Exception as e:
        print(f" Raising exception ")
        x = 20
        return x
    finally:
        x = 30
        return x

print(test_func())


Output:
Raising exception
30

Jadi, sekali lagi nilai keluaran x akan menjadi 30. Kita harus ingat fakta bahwa pernyataan akhirnya akan dieksekusi SELALU

Untuk mendapatkan gambaran yang lebih jelas tentang alur eksekusi, mari tambahkan pernyataan cetak di setiap blok

def test_func():
    try:
        x = 10
        print(f" Inside try block ")
        return x
    except Exception as e:
        x = 20
        print(f" Inside except block ")
        return x
    finally:
        x = 30
        print(f" Inside finally block ")
        return x

print(test_func())


Output:
Inside try block
Inside finally block
30
_

Ini akan memberikan gambaran tentang aliran eksekusi. Sekarang setelah kita memiliki pemahaman yang baik tentang bagaimana coba/kecuali/akhirnya bekerja dengan pernyataan pengembalian, mari kita coba memasukkan klausa lain

Klausa lain dapat ditambahkan bersama dengan coba/kecuali dan klausa lain akan dieksekusi jika blok coba tidak memunculkan pengecualian

3. Penggunaan return dengan try/else/finally

def test_func():
    try:
        x = 10
        print(f" Inside try block ")
        return x
    except Exception as e:
        x = 20
        print(f" Inside except block ")
        return x
    else:
        print(f" Inside else block ")
        x = 40
        return x
    finally:
        x = 30
        print(f" Inside finally block ")
        return x



print(test_func())

Output:

Inside try block
Inside finally block
30

Jadi, mengapa klausa else tidak dieksekusi di sini meskipun blok try tidak memunculkan pengecualian apa pun. Perhatikan pernyataan return di blok try. Blok else tidak pernah dieksekusi karena fungsi dikembalikan bahkan sebelum eksekusi mencapai klausa else

Sekarang hapus pernyataan return di blok try dan jalankan kembali kode di atas

def test_func():
    try:
        x = 10
        print(f" Inside try block ")
    except Exception as e:
        x = 20
        print(f" Inside except block ")
        return x
    else:
        print(f" Inside else block ")
        x = 40
        return x
    finally:
        x = 30
        print(f" Inside finally block ")
        return x



print(test_func())

Output:
Inside try block
Inside else block
Inside finally block
30
_

Ringkasan

  • Berhati-hatilah saat menambahkan kembali dalam klausa coba/kecuali/akhirnya

  • Klausa akhirnya berjalan apakah pernyataan try menghasilkan pengecualian atau tidak

  • Jika klausa akhirnya menyertakan pernyataan pengembalian, nilai yang dikembalikan akan menjadi salah satu dari pernyataan pengembalian klausa akhirnya

  • Klausa lain akan dieksekusi jika blok percobaan tidak memunculkan pengecualian

Referensi

  • https. //dokumen. python. org/3/tutorial/kesalahan. html

  • https. //stackoverflow. com/questions/11164144/aneh-coba-kecuali-lain-akhirnya-perilaku-dengan-return-pernyataan

    Bagaimana Anda mengembalikan pengecualian dengan Python?

    Sebagai pengembang Python, Anda dapat memilih untuk melontarkan pengecualian jika suatu kondisi terjadi. Untuk membuang (atau menaikkan) pengecualian, gunakan kata kunci kenaikan .

    Bagaimana cara mengembalikan pengecualian?

    Instruksi Kembali Dari Pengecualian dapat dikeluarkan hanya dari pemanggilan awal urutan penanganan pengecualian eksternal atau dari pemanggilan yang memiliki penangan pengecualian internal yang aktif

    Bisakah kita kembali kecuali dengan Python?

    Perilaku pengembalian dengan coba/kecuali dengan Python . Python mendefinisikan coba/kecuali untuk menangani pengecualian dan melanjutkan eksekusi program lebih lanjut tanpa gangguan. User code can raise built-in exceptions. Python defines try/except to handle exceptions and proceed with the further execution of program without interruption.

    Apa fungsi untuk memunculkan pengecualian?

    Fungsi RaiseException memungkinkan proses menggunakan penanganan pengecualian terstruktur untuk menangani pengecualian pribadi, yang dihasilkan perangkat lunak, dan ditentukan aplikasi.