Kapan Anda harus menaikkan python pengecualian?

Saya sering kesulitan menentukan kapan dan bagaimana menggunakan pengecualian. Mari kita pertimbangkan contoh sederhana. misalkan saya sedang menggores halaman web, katakan "http. // www. abe vigoda. com/", untuk menentukan apakah Abe Vigoda masih hidup. Untuk melakukan ini, yang perlu kita lakukan hanyalah mengunduh halaman dan mencari waktu munculnya frase "Abe Vigoda". Kami mengembalikan penampilan pertama, karena itu termasuk status Abe. Secara konseptual, akan terlihat seperti ini

def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"

Di mana parse_abe_status(s) mengambil string dari bentuk "Abe Vigoda adalah sesuatu" dan mengembalikan bagian "sesuatu"

Sebelum Anda berpendapat bahwa ada cara yang jauh lebih baik dan lebih kuat untuk menggores halaman ini untuk status Abe, ingatlah bahwa ini hanyalah contoh sederhana dan dibuat-buat yang digunakan untuk menyoroti situasi umum yang saya alami

Sekarang, di mana kode ini dapat mengalami masalah?

  • download_page mungkin tidak dapat mengunduh halaman, dan menampilkan IOError
  • URL mungkin tidak mengarah ke halaman yang benar, atau halaman diunduh dengan tidak benar, sehingga tidak ada klik. hits_ adalah daftar kosong, kalau begitu
  • Halaman web telah diubah, mungkin membuat asumsi kami tentang halaman tersebut salah. Mungkin kita mengharapkan 4 penyebutan Abe Vigoda, tetapi sekarang kita menemukan 5
  • Untuk beberapa alasan,
    def parse_abe_status(s):
        return s[13:]
    
    0 mungkin bukan string dari bentuk "Abe Vigoda adalah sesuatu", sehingga tidak dapat diuraikan dengan benar

Kasus pertama tidak terlalu menjadi masalah bagi saya. sebuah IOError dilemparkan dan dapat ditangani oleh pemanggil fungsi saya. Jadi mari kita pertimbangkan kasus lain dan bagaimana saya bisa menanganinya. Tapi pertama-tama, mari kita asumsikan bahwa kita menerapkan

def parse_abe_status(s):
    return s[13:]
2 dengan cara yang paling bodoh

def parse_abe_status(s):
    return s[13:]
_

Yaitu, itu tidak melakukan pengecekan kesalahan. Sekarang, ke opsi

Pilihan 1. Kembalikan def parse_abe_status(s): return s[13:] _3

Saya dapat memberi tahu penelepon bahwa ada yang tidak beres dengan mengembalikan

def parse_abe_status(s):
    return s[13:]
3

def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    if not hits:
        return None

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"
_

Jika penelepon menerima

def parse_abe_status(s):
    return s[13:]
3 dari fungsi saya, dia harus berasumsi bahwa tidak ada penyebutan Abe Vigoda, sehingga terjadi kesalahan. Tapi ini cukup kabur, kan?

Di sisi lain, kita dapat memasukkan beberapa pengecualian

pilihan 2. Menggunakan Pengecualian

Jika hits kosong,

def parse_abe_status(s):
    return s[13:]
8 akan dilempar saat kita mencoba
def parse_abe_status(s):
    return s[13:]
0. Tetapi penelepon seharusnya tidak diharapkan untuk menangani
def parse_abe_status(s):
    return s[13:]
8 yang dilemparkan oleh fungsi saya, karena dia tidak tahu dari mana
def parse_abe_status(s):
    return s[13:]
8 itu berasal; . Jadi kami akan membuat kelas pengecualian khusus untuk menangani ini

class NotFoundError(Exception):
    """Throw this when something can't be found on a page."""

def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    try:
        hits[0]
    except IndexError:
        raise NotFoundError("No mentions found.")

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"

Sekarang bagaimana jika halaman telah berubah dan ada jumlah klik yang tidak terduga? . Jadi saya akan memberikan peringatan

class NotFoundError(Exception):
    """Throw this when something can't be found on a page."""

def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    try:
        hits[0]
    except IndexError:
        raise NotFoundError("No mentions found.")

    # say we expect four hits...
    if len(hits) != 4:
        raise Warning("An unexpected number of hits.")
        logger.warning("An unexpected number of hits.")

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"

Terakhir, kita mungkin menemukan bahwa

def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    if not hits:
        return None

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"
_3 tidak hidup atau mati. Mungkin, untuk alasan yang aneh, hari ini ternyata
def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    if not hits:
        return None

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"
4. Maka saya tidak ingin mengembalikan
def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    if not hits:
        return None

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    # he's either alive or dead
    return status == "alive"
5, karena itu menyiratkan bahwa Abe sudah mati. Apa yang harus saya lakukan di sini? . Tapi jenis apa?

class NotFoundError(Exception):
    """Throw this when something can't be found on a page."""

def get_abe_status(url):
    # download the page
    page = download_page(url)

    # get all mentions of Abe Vigoda
    hits = page.find_all_mentions("Abe Vigoda")

    try:
        hits[0]
    except IndexError:
        raise NotFoundError("No mentions found.")

    # say we expect four hits...
    if len(hits) != 4:
        raise Warning("An unexpected number of hits.")
        logger.warning("An unexpected number of hits.")

    # parse the first hit for his status
    status = parse_abe_status(hits[0])

    if status not in ['alive', 'dead']:
        raise SomeTypeOfError("Status is an unexpected value.")

    # he's either alive or dead
    return status == "alive"

Opsi 3. Suatu tempat di antara

Saya pikir metode kedua, dengan pengecualian, lebih disukai, tetapi saya tidak yakin apakah saya menggunakan pengecualian dengan benar di dalamnya. Saya ingin tahu bagaimana programmer yang lebih berpengalaman akan menangani ini

Kapan saya harus mengajukan pengecualian?

Pengecualian harus digunakan untuk situasi luar biasa di luar logika normal suatu program . Dalam program contoh, nilai di luar rentang kemungkinan cukup umum dan harus ditangani dengan menggunakan logika tipe if-else yang normal.

Mengapa Anda mengajukan pengecualian dengan Python?

Terkadang Anda ingin Python melontarkan pengecualian khusus untuk penanganan kesalahan . Anda dapat melakukan ini dengan memeriksa suatu kondisi dan menaikkan pengecualian, jika kondisinya Benar. Pengecualian yang dimunculkan biasanya memperingatkan pengguna atau aplikasi panggilan.

Kapan saya harus menggunakan kenaikan gaji dengan Python?

Definisi dan Penggunaan . Anda dapat menentukan jenis kesalahan apa yang akan dimunculkan, dan teks yang akan dicetak ke pengguna. to raise an exception. You can define what kind of error to raise, and the text to print to the user.

Kapan sebaiknya Anda menggunakan exception handling Python?

Alasan untuk menggunakan coba/kecuali adalah ketika Anda memiliki blok kode untuk dieksekusi yang terkadang akan berjalan dengan benar dan terkadang tidak , bergantung pada .