Python mengembalikan pengecualian ke fungsi pemanggilan

💬 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 stuff

Namun, mengembalikan nilai dummy tidak terlalu Pythonic

Solusi Praktik Terbaik

Python mengembalikan pengecualian ke fungsi pemanggilan

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?

Python mengembalikan pengecualian ke fungsi pemanggilan

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

Python mengembalikan pengecualian ke fungsi pemanggilan

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 stack

Perhatikan 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 defined

Anda 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

Python mengembalikan pengecualian ke fungsi pemanggilan

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

Bagaimana Anda menangani pengecualian dalam panggilan fungsi dengan Python?

Untuk menangani pengecualian, kami telah memasukkan kode, result = pembilang/penyebut di dalam blok try . Sekarang ketika pengecualian terjadi, sisa kode di dalam blok percobaan akan dilewati. Kecuali blok menangkap pengecualian dan pernyataan di dalam kecuali blok dieksekusi.

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 Anda menangani pengecualian dari fungsi pemanggilan?

Pemanggil harus menangani pengecualian menggunakan blok try-catch atau menyebarkan pengecualian . Kami dapat membuang pengecualian yang dicentang atau tidak dicentang. Kata kunci throws memungkinkan kompiler untuk membantu Anda menulis kode yang menangani jenis kesalahan ini, tetapi tidak mencegah penghentian program yang tidak normal.

Apakah memunculkan pengecualian menghentikan eksekusi Python?

Saat pengecualian dimunculkan, tidak ada pernyataan lebih lanjut dalam blok kode saat ini yang dieksekusi. Kecuali pengecualian ditangani (dijelaskan di bawah), juru bahasa akan kembali langsung ke loop read-eval-print interaktif, atau berhenti seluruhnya jika Python dimulai dengan argumen file