Ketika sesuatu yang tidak terduga terjadi pada kode untuk suatu fungsi atau metode, ada 4 cara untuk menunjukkan adanya masalah
- mengajukan pengecualian, dengan pesan
- gunakan penegasan untuk meningkatkan AssertionError dengan pesan
- mengembalikan nilai khusus (sesuatu yang biasanya tidak dapat dikembalikan)
- mencetak pesan di konsol
Pertimbangkan fungsi untuk mengembalikan indeks nilai dalam daftar
def index(lst, value): """Return the index of the first element in lst that equals value""" return lst.index(value) >>> lst = ['a', 'b', 'c', 'b'] >>> index(lst, 'b') 1 >>> index(lst,'z') ValueError: 'z' is not in list
Naikkan Pengecualian
Dalam contoh ini, metode def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list _1 bawaan memunculkan ValueError jika argumen tidak ada dalam daftar. Jadi kita tidak perlu menambahkan kode apapun- Gunakan menegaskan dengan tes bahwa nilainya ada dalam daftar
def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list _
- Mengembalikan nilai khusus. Mari kembalikan -1, yang biasanya tidak pernah menjadi indeks
def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1
- Cetak pesan di konsol. Dalam hal ini, kita masih perlu mengembalikan sesuatu agar program dapat dijalankan. Jika kita hanya menulis def index(lst, value):
assert value in lst, f"{value} is not in list"
return lst.index(value)
>>> index(['a', 'b', 'c'], 'd')
AssertionError: 'd' is not in list
_2 Python akan mengembalikan def index(lst, value):
assert value in lst, f"{value} is not in list"
return lst.index(value)
>>> index(['a', 'b', 'c'], 'd')
AssertionError: 'd' is not in list
3
def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed _
Solusi mana yang terbaik?
Jawabannya tergantung pada tujuan fungsi dan kondisi yang Anda periksa
- Gunakan penegasan untuk memeriksa kondisi yang tidak boleh terjadi dalam kode yang benar, termasuk pelanggaran prasyarat atau invarian (hal yang harus selalu benar)
- menegaskan digunakan untuk menangkap kesalahan pemrograman dan untuk debugging
- jika def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list 4 gagal, program akan berhenti dengan AssertionError. Ini lebih baik daripada diam-diam mengabaikan kesalahan sampai program gagal, karena membantu mengidentifikasi sumber masalah
- programmer tidak diharapkan menangkap AssertionError
- Dalam penggunaan produksi, pernyataan dapat dinonaktifkan menggunakan opsi python def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list 5
- def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list _4 pernyataan memberikan dokumentasi internal tentang apa yang diharapkan benar – prasyarat dan kondisi lain yang harus benar jika kodenya benar
- Gunakan pengecualian untuk kondisi kesalahan yang dapat terjadi dalam kode yang benar, dan untuk fungsi/metode publik (seperti di perpustakaan) di mana fungsi tersebut mungkin dipanggil dengan nilai yang salah
- programmer dapat menangkap pengecualian dan menanganinya
- Untuk kondisi yang tidak biasa atau tidak terduga yang dapat terjadi secara wajar dalam kode yang benar dan bukan kesalahan, Anda dapat mengembalikan nilai khusus atau menaikkan Pengecualian. Pilihannya tergantung pada preferensi dan bagaimana kode itu dimaksudkan untuk digunakan
- programmer diharapkan untuk memeriksa nilai pengembalian khusus
- Mencetak pesan di konsol bukanlah solusi yang baik
- Untuk aplikasi interaktif, biarkan penelepon mencetak pesan melalui UI biasa
- Pencatatan dapat digunakan bersama dengan pengecualian untuk mencatat kondisi kesalahan
Dalam fungsi def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list _7, mencari nilai yang tidak ada dalam daftar mungkin merupakan hal yang wajar untuk dilakukan (bergantung pada aplikasinya). Jadi, "berikan pengecualian" atau "kembalikan nilai khusus" adalah solusi yang dapat diterima
- def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list 8 Python memunculkan ValueError
- def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list 9 Java mengembalikan -1 jika nilai tidak ada dalam daftar
Latihan
Fungsi ini menghitung rata-rata daftar angka
def average(values) -> float: """Return the average of a list of values. Must supply at least one value""" return sum(values) / len(values)
Jika parameter def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 _0 adalah daftar kosong, apa yang terjadi?
Ubah kode untuk menaikkan ValueError jika daftar kosong
Tambahkan def index(lst, value): assert value in lst, f"{value} is not in list" return lst.index(value) >>> index(['a', 'b', 'c'], 'd') AssertionError: 'd' is not in list _4 untuk menguji apakah daftar tersebut tidak kosong. Tampilkan pesan jika pernyataan gagal
Buat fungsi def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 _2 pengembalian 0. 0 jika daftar kosong. Bisakah Anda melakukan ini tanpa "jika .. lain"?
Solusi mana yang menurut Anda terbaik untuk rata-rata?
Latihan
Baca baris pertama dari file dan kembalikan
def head(filename) -> str: """Return the first line from a file.""" file = open(filename, 'r') first_line = file.readline() file.close() return first_line
Apa yang harus dilakukan def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 3 jika nama file yang diminta tidak ada atau tidak dapat dibuka?
Apa yang harus dilakukan def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 3 jika file kosong?
- Apakah ada kesalahan penggunaan yang dapat Anda gunakan untuk memeriksa ________1______4?
- tidak perlu memeriksa bahwa nama file adalah string. def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 6 akan menangkapnya
- Tulis ulang def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 _3 untuk menggunakan solusi Anda. Jika berlaku untuk kode Anda, tulis ulang juga untuk menggunakan blok "dengan" untuk menutup file secara otomatis saat eksekusi meninggalkan blok
Sintaks Assert
assert condition, expression
"Tegaskan" kondisi yang seharusnya Benar. Jika kondisinya Salah, maka AssertionError dimunculkan dengan hasil def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 8 sebagai teks pesan pengecualian. def index(lst, value): if value not in lst: return -1 return lst.index(value) >>> index(['a', 'b', 'c'], 'd') -1 8 dapat berupa string atau apapun yang menghasilkan string (seperti referensi fungsi yang mengembalikan string)
assert math.sqrt(25)==5, "sqrt is broken"
Jangan Menaikkan root def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed 0 Type
Anda harus memunculkan jenis pengecualian tertentu, seperti ValueError atau TypeError. Jika Anda sedang menulis fungsi perpustakaan dan tidak ada tipe pengecualian standar yang berlaku untuk situasi tersebut, maka tentukan subkelas pengecualian Anda sendiri
Anda tidak boleh menaikkan jenis def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed _0 atau def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed 2 basis, yang merupakan kelas dasar untuk pengecualian lainnya
Kenapa tidak?
- Itu tidak deskriptif atau spesifik
- Jika pemrogram menggunakan def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed _3, ia akan menangkap pengecualian apa pun, termasuk hal-hal yang tidak dimaksudkan untuk ditangkap
- def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed 4 juga akan menangkap KeyboardInterrupt (Ctrl-C)
Pengecualian Khusus "Tangkap" Saja
Hindari menulis def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed _5 (menangkap hampir semua pengecualian). Itu dapat menutupi kesalahan yang tidak terduga. Hanya tangkap pengecualian yang Anda harapkan terjadi