💬 Pertanyaan. Bagaimana Anda menulis fungsi yang mengembalikan kesalahan Python nyata alih-alih "kode kesalahan" seperti -1 atau None jika terjadi kesalahan?
Misalnya, Anda mungkin ingin memeriksa argumen input fungsi untuk jenis atau panjang yang benar (dalam kasus argumen iterable) sebelum menjalankan badan fungsi. Jika pengujian Anda gagal, Anda ingin mengembalikan pesan kesalahan
Berikut adalah contoh di mana Anda mengembalikan -1 untuk menunjukkan bahwa telah terjadi kesalahan, saya. e. , argumen memiliki panjang yang berbeda
def f(l1, l2): if len(l1) != len(l2): # Error Should Be Returned return -1 # Do stuffNamun, mengembalikan nilai dummy tidak terlalu Pythonic
Solusi Praktik Terbaik
Solusi praktik terbaik untuk menunjukkan bahwa ada kesalahan dalam fungsi Python adalah tidak mengembalikan nilai dummy tetapi meningkatkan kesalahan menggunakan sintaks seperti def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 1
Keuntungan utama adalah bahwa kesalahan menyebar (istilah teknis. "gelembung") melalui tumpukan pemanggilan fungsi hingga tertangkap oleh pernyataan def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 2
Contoh. jika fungsi def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') _3 memanggil fungsi def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 4 yang memanggil fungsi def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 5 yang menimbulkan kesalahan, kesalahan akan disebarkan ke def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 4 dan kemudian ke def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 3 yang dapat menangkapnya menggunakan blok def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 8
Keuntungan lain dari meningkatkan kesalahan adalah keterbacaan
Pesan kesalahan menunjukkan masalah dalam pesan teks berbahasa Inggris yang mudah dipahami. Angka ajaib kemungkinan besar akan disalahartikan, mis. g. , penelepon fungsi mungkin berpikir bahwa angka ajaib adalah keluaran sebenarnya dari fungsi — dan bukan kode kesalahan
Contoh
Mari kita lihat contoh yang disederhanakan
def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') _Ini mengarah ke output berikut
Traceback (most recent call last): File "C:\Users\...\code.py", line 8, in <module> f('hello', 'hi') File "C:\Users\...\code.py", line 4, in f raise ValueError("Arguments have different lengths!") ValueError: Arguments have different lengths!Ini membawa kita ke pertanyaan berikut
Bagaimana Cara Menangkap Kesalahan?
Untuk menangkap kesalahan dan menghindari kesalahan menghentikan seluruh program Anda, Anda perlu menangkapnya menggunakan blok def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 9
🌍 Tutorial yang Direkomendasikan. Python Coba/Kecuali — Panduan Sederhana
Python Coba Kecuali. Panduan Bergambar
Tonton video ini di YouTube
Ini contoh minimal
def f(l1, l2): if len(l1) != len(l2): # Error Should Be Returned raise ValueError("Arguments have different lengths!") # Do stuff try: f('hello', 'hi') except: print('No error stack')Outputnya sederhana
No error stackPerhatikan bahwa kesalahan akan "menggelembungkan" pemanggilan fungsi jika Anda memiliki beberapa fungsi yang saling memanggil hingga satu pemanggilan fungsi disematkan dalam blok def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 9 dan kesalahan ditangkap olehnya
Di sini’ kita tidak akan pernah mencapai garis yang disorot dalam fungsi def f(l1, l2): if len(l1) != len(l2): raise ValueError("Arguments have different lengths!") # Do stuff f('hello', 'hi') 4 karena kesalahan menyebar melalui tumpukan fungsi
def f(l1, l2): if len(l1) != len(l2): # Error Should Be Returned raise ValueError("Arguments have different lengths!") # Do stuff def g(l1, l2): f(l1, l2) print('Never reached when error') try: g('hello', 'hi') except: print('No error stack')Mari kita lihat kasus di mana Anda tidak menemukan kesalahan—bagaimana tampilan keluaran "jejak tumpukan"?
def f(l1, l2): if len(l1) != len(l2): # Error Should Be Returned raise Error("Arguments have different lengths!") # Do stuff def g(l1, l2): f(l1, l2) print('Never reached when error') g([1, 2, 3], [])Keluaran
Traceback (most recent call last): File "C:\...\code.py", line 13, in <module> g([1, 2, 3], []) File "C:\...\code.py", line 9, in g f(l1, l2) File "C:\...\code.py", line 4, in f raise Error("Arguments have different lengths!") NameError: name 'Error' is not definedAnda dapat melihat bahwa output memberi Anda semua detail tentang pemanggilan fungsi dan bagaimana kesalahan menyebar melalui tumpukan fungsi
Ringkasan
Untuk mengembalikan kesalahan dari fungsi Python, jangan gunakan nilai dummy seperti Traceback (most recent call last): File "C:\Users\...\code.py", line 8, in <module> f('hello', 'hi') File "C:\Users\...\code.py", line 4, in f raise ValueError("Arguments have different lengths!") ValueError: Arguments have different lengths!2 atau Traceback (most recent call last): File "C:\Users\...\code.py", line 8, in <module> f('hello', 'hi') File "C:\Users\...\code.py", line 4, in f raise ValueError("Arguments have different lengths!") ValueError: Arguments have different lengths!3. Sebagai gantinya, gunakan kata kunci Traceback (most recent call last): File "C:\Users\...\code.py", line 8, in <module> f('hello', 'hi') File "C:\Users\...\code.py", line 4, in f raise ValueError("Arguments have different lengths!") ValueError: Arguments have different lengths!_4 seperti Traceback (most recent call last): File "C:\Users\...\code.py", line 8, in <module> f('hello', 'hi') File "C:\Users\...\code.py", line 4, in f raise ValueError("Arguments have different lengths!") ValueError: Arguments have different lengths!5. Kesalahan akan "menggelembungkan" tumpukan sampai tertangkap oleh blok coba/kecuali
Terima kasih telah membaca seluruh tutorial. ❤️ Untuk terus belajar, silakan periksa akademi email gratis kami dan unduh lembar contekan kami di sini
Chris
Saat bekerja sebagai peneliti dalam sistem terdistribusi, Dr. Christian Mayer menemukan cintanya untuk mengajar siswa ilmu komputer
Untuk membantu siswa mencapai tingkat kesuksesan Python yang lebih tinggi, dia mendirikan situs web pendidikan pemrograman Finxter. com. Dia adalah penulis buku pemrograman populer Python One-Liners (NoStarch 2020), rekan penulis seri Coffee Break Python dari buku yang diterbitkan sendiri, penggemar ilmu komputer, pekerja lepas, dan pemilik salah satu dari 10 blog Python terbesar di dunia
Kesukaannya adalah menulis, membaca, dan coding. Tetapi hasrat terbesarnya adalah untuk melayani calon pembuat kode melalui Finxter dan membantu mereka meningkatkan keterampilan mereka. Anda dapat bergabung dengan akademi email gratisnya di sini