Apa yang dilakukan raise () dengan python?

Kata kunci kenaikan digunakan untuk membuat pengecualian secara terprogram dalam Program Python. Mekanisme penanganan pengecualian Python disediakan melalui kata kunci. coba, kecuali, akhirnya dan naikkan.  

Kedua bentuk kenaikan gaji yang diberikan di sini melakukan hal yang sama - keduanya menimbulkan pengecualian

menaikkan

atau

menaikkan

Kode apa pun yang berpotensi menghasilkan pengecualian dapat dibungkus di dalam blok try dan sekumpulan blok kecuali yang salah satunya menangani pengecualian.   

Setelah pengecualian dibuat, Python akan mencari pencocokan kecuali penangan. Jika tidak ditemukan dalam lingkup saat ini, pencarian dilanjutkan dalam lingkup terlampir sampai penangan pengecualian ditemukan. Pengecualian ditangani oleh penangan pengecualian yang ditemukan. Jika penangan pengecualian tidak ditemukan, program akan mencetak  traceback dan keluar.  

Sampai saat ini pesan kesalahan belum banyak disebutkan, tetapi jika Anda telah mencoba contoh-contohnya, Anda mungkin telah melihat beberapa. Ada (setidaknya) dua jenis kesalahan yang dapat dibedakan. kesalahan sintaksis dan pengecualian

8. 1. Kesalahan Sintaks

Kesalahan sintaksis, juga dikenal sebagai kesalahan penguraian, mungkin merupakan jenis keluhan paling umum yang Anda dapatkan saat masih mempelajari Python

>>> while True print('Hello world')
  File "<stdin>", line 1
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

Parser mengulangi baris yang menyinggung dan menampilkan 'panah' kecil yang menunjuk ke titik paling awal di baris tempat kesalahan terdeteksi. Kesalahan disebabkan oleh (atau setidaknya terdeteksi pada) token yang mendahului tanda panah. dalam contoh, kesalahan terdeteksi pada fungsi, karena titik dua (

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
7) hilang sebelum. Nama file dan nomor baris dicetak sehingga Anda tahu ke mana harus mencari jika input berasal dari skrip

8. 2. Pengecualian

Bahkan jika sebuah pernyataan atau ekspresi benar secara sintaksis, itu dapat menyebabkan kesalahan ketika upaya dilakukan untuk mengeksekusinya. Kesalahan yang terdeteksi selama eksekusi disebut pengecualian dan tidak fatal tanpa syarat. Anda akan segera belajar cara menanganinya dalam program Python. Namun, sebagian besar pengecualian tidak ditangani oleh program, dan menghasilkan pesan kesalahan seperti yang ditampilkan di sini

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

Baris terakhir dari pesan kesalahan menunjukkan apa yang terjadi. Pengecualian datang dalam berbagai jenis, dan jenisnya dicetak sebagai bagian dari pesan. jenis dalam contoh adalah , dan. String yang dicetak sebagai tipe pengecualian adalah nama dari pengecualian bawaan yang terjadi. Ini berlaku untuk semua pengecualian bawaan, tetapi tidak harus benar untuk pengecualian yang ditentukan pengguna (walaupun ini adalah konvensi yang berguna). Nama pengecualian standar adalah pengidentifikasi bawaan (bukan kata kunci yang dicadangkan)

Baris selanjutnya memberikan detail berdasarkan jenis pengecualian dan apa yang menyebabkannya

Bagian sebelumnya dari pesan kesalahan menunjukkan konteks di mana pengecualian terjadi, dalam bentuk stack traceback. Secara umum ini berisi baris sumber daftar traceback stack;

mencantumkan pengecualian bawaan dan artinya

8. 3. Menangani Pengecualian

Dimungkinkan untuk menulis program yang menangani pengecualian yang dipilih. Lihat contoh berikut, yang meminta input dari pengguna hingga integer yang valid telah dimasukkan, tetapi memungkinkan pengguna untuk menginterupsi program (menggunakan Control-C atau apa pun yang didukung oleh sistem operasi);

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
_

Pernyataan tersebut berfungsi sebagai berikut

  • Pertama, klausa try (pernyataan antara dan kata kunci) dijalankan

  • Jika tidak ada pengecualian yang terjadi, kecuali klausa dilewati dan eksekusi pernyataan selesai

  • Jika pengecualian terjadi selama eksekusi klausa, klausa lainnya akan dilewati. Kemudian, jika tipenya cocok dengan pengecualian yang dinamai menurut kata kunci, klausa kecuali dieksekusi, dan kemudian eksekusi dilanjutkan setelah blok coba/kecuali

  • Jika pengecualian terjadi yang tidak cocok dengan pengecualian yang disebutkan dalam klausa kecuali, itu diteruskan ke pernyataan luar;

Pernyataan mungkin memiliki lebih dari satu kecuali klausa, untuk menentukan penangan untuk pengecualian yang berbeda. Paling banyak satu penangan akan dieksekusi. Handler hanya menangani exception yang terjadi pada klausa try yang sesuai, bukan pada handler lain dari pernyataan

... except (RuntimeError, TypeError, NameError):
...     pass
2 yang sama. Sebagai contoh, sebuah klausa yang dapat menyebutkan beberapa pengecualian sebagai tupel dalam tanda kurung

... except (RuntimeError, TypeError, NameError):
...     pass
_

Kelas dalam klausa kompatibel dengan pengecualian jika itu adalah kelas yang sama atau kelas dasar daripadanya (tetapi tidak sebaliknya — klausa pengecualian yang mencantumkan kelas turunan tidak kompatibel dengan kelas dasar). Misalnya, kode berikut akan mencetak B, C, D dalam urutan tersebut

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
_

Perhatikan bahwa jika klausa kecuali dibalik (dengan

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
2 pertama), itu akan dicetak B, B, B — pencocokan pertama kecuali klausa dipicu

Ketika pengecualian terjadi, itu mungkin memiliki nilai terkait, juga dikenal sebagai argumen pengecualian. Kehadiran dan jenis argumen bergantung pada jenis pengecualian

Klausa kecuali dapat menentukan variabel setelah nama pengecualian. Variabel terikat pada contoh pengecualian yang biasanya memiliki atribut

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
3 yang menyimpan argumen. Untuk kenyamanan, tipe pengecualian bawaan mendefinisikan
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
4 untuk mencetak semua argumen tanpa mengakses
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
5 secara eksplisit

>>> try:
..     raise Exception('spam', 'eggs')
.. except Exception as inst:
..     print(type(inst))    # the exception instance
..     print(inst.args)     # arguments stored in .args
..     print(inst)          # __str__ allows args to be printed directly,
..                          # but may be overridden in exception subclasses
..     x, y = inst.args     # unpack args
..     print('x =', x)
..     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

Keluaran

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
4 pengecualian dicetak sebagai bagian terakhir ('detail') dari pesan untuk pengecualian yang tidak tertangani

adalah kelas dasar umum dari semua pengecualian. Salah satu subkelasnya, , adalah kelas dasar dari semua pengecualian non-fatal. Pengecualian yang bukan merupakan subkelas dari biasanya tidak ditangani, karena digunakan untuk menunjukkan bahwa program harus dihentikan. Mereka termasuk yang dimunculkan oleh dan yang dimunculkan ketika pengguna ingin menghentikan program

dapat digunakan sebagai wildcard yang menangkap (hampir) semuanya. Namun, merupakan praktik yang baik untuk sespesifik mungkin dengan jenis pengecualian yang ingin kami tangani, dan untuk memungkinkan pengecualian yang tidak diharapkan menyebar di

Pola penanganan yang paling umum adalah mencetak atau mencatat pengecualian, lalu memunculkannya kembali (memungkinkan penelepon untuk menangani pengecualian juga)

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error:", err)
except ValueError:
    print("Could not convert data to an integer.")
except Exception as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise

Pernyataan … memiliki klausa lain opsional, yang, jika ada, harus mengikuti semua kecuali klausa. Berguna untuk kode yang harus dijalankan jika klausa try tidak memunculkan eksepsi. Sebagai contoh

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

Penggunaan klausa

>>> try:
..     raise Exception('spam', 'eggs')
.. except Exception as inst:
..     print(type(inst))    # the exception instance
..     print(inst.args)     # arguments stored in .args
..     print(inst)          # __str__ allows args to be printed directly,
..                          # but may be overridden in exception subclasses
..     x, y = inst.args     # unpack args
..     print('x =', x)
..     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
_7 lebih baik daripada menambahkan kode tambahan ke klausa karena menghindari secara tidak sengaja menangkap pengecualian yang tidak dimunculkan oleh kode yang dilindungi oleh pernyataan
... except (RuntimeError, TypeError, NameError):
...     pass
2 …
... except (RuntimeError, TypeError, NameError):
...     pass
4

Penangan pengecualian tidak hanya menangani pengecualian yang muncul langsung di klausa try, tetapi juga yang terjadi di dalam fungsi yang dipanggil (bahkan secara tidak langsung) di klausa try. Sebagai contoh

>>> def this_fails():
..     x = 1/0
...
>>> try:
..     this_fails()
.. except ZeroDivisionError as err:
..     print('Handling run-time error:', err)
...
Handling run-time error: division by zero

8. 4. Meningkatkan Pengecualian

Pernyataan itu memungkinkan pemrogram untuk memaksa pengecualian tertentu terjadi. Sebagai contoh

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: HiThere

Satu-satunya argumen untuk menunjukkan pengecualian yang akan diajukan. Ini harus berupa instance pengecualian atau kelas pengecualian (kelas yang berasal dari , seperti atau salah satu subkelasnya). Jika kelas pengecualian dilewatkan, itu akan secara implisit dipakai dengan memanggil konstruktornya tanpa argumen

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
0

Jika Anda perlu menentukan apakah pengecualian muncul tetapi tidak bermaksud untuk menanganinya, bentuk pernyataan yang lebih sederhana memungkinkan Anda untuk menaikkan kembali pengecualian

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
1

8. 5. Rantai Pengecualian

Jika pengecualian yang tidak tertangani terjadi di dalam suatu bagian, pengecualian yang ditangani akan dilampirkan padanya dan disertakan dalam pesan kesalahan

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
2

Untuk menunjukkan bahwa pengecualian adalah konsekuensi langsung dari yang lain, pernyataan itu memungkinkan klausa opsional

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
_3

Ini bisa berguna saat Anda mengubah pengecualian. Sebagai contoh

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
_4

Itu juga memungkinkan penonaktifan rangkaian pengecualian otomatis menggunakan idiom

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error:", err)
except ValueError:
    print("Could not convert data to an integer.")
except Exception as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise
9

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
5

Untuk informasi lebih lanjut tentang mekanisme rantai, lihat

8. 6. Pengecualian Buatan Pengguna

Program dapat menamai pengecualiannya sendiri dengan membuat kelas pengecualian baru (lihat lebih lanjut tentang kelas Python). Pengecualian biasanya harus diturunkan dari kelas, baik secara langsung maupun tidak langsung

Kelas pengecualian dapat didefinisikan yang melakukan apa pun yang dapat dilakukan kelas lain, tetapi biasanya tetap sederhana, seringkali hanya menawarkan sejumlah atribut yang memungkinkan informasi tentang kesalahan diekstraksi oleh penangan untuk pengecualian

Sebagian besar pengecualian ditentukan dengan nama yang diakhiri dengan "Kesalahan", mirip dengan penamaan pengecualian standar

Banyak modul standar menentukan pengecualian mereka sendiri untuk melaporkan kesalahan yang mungkin terjadi pada fungsi yang mereka tentukan

8. 7. Mendefinisikan Tindakan Pembersihan

Pernyataan tersebut memiliki klausa opsional lain yang dimaksudkan untuk menentukan tindakan pembersihan yang harus dilakukan dalam semua keadaan. Sebagai contoh

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
6

Jika ada klausa, klausa

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
_2 akan dieksekusi sebagai tugas terakhir sebelum pernyataan selesai. Klausa
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
2 berjalan apakah pernyataan
... except (RuntimeError, TypeError, NameError):
...     pass
2 menghasilkan pengecualian atau tidak. Poin-poin berikut membahas kasus yang lebih kompleks ketika pengecualian terjadi

  • Jika pengecualian terjadi selama eksekusi klausa

    ... except (RuntimeError, TypeError, NameError):
    ...     pass
    
    2, pengecualian dapat ditangani oleh klausa. Jika pengecualian tidak ditangani oleh klausa
    ... except (RuntimeError, TypeError, NameError):
    ...     pass
    
    _4, pengecualian akan dimunculkan kembali setelah klausa
    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    
    2 dieksekusi

  • Pengecualian dapat terjadi selama eksekusi klausa

    ... except (RuntimeError, TypeError, NameError):
    ...     pass
    
    _4 atau
    >>> try:
    ..     raise Exception('spam', 'eggs')
    .. except Exception as inst:
    ..     print(type(inst))    # the exception instance
    ..     print(inst.args)     # arguments stored in .args
    ..     print(inst)          # __str__ allows args to be printed directly,
    ..                          # but may be overridden in exception subclasses
    ..     x, y = inst.args     # unpack args
    ..     print('x =', x)
    ..     print('y =', y)
    ...
    <class 'Exception'>
    ('spam', 'eggs')
    ('spam', 'eggs')
    x = spam
    y = eggs
    
    7. Sekali lagi, pengecualian dimunculkan kembali setelah klausa
    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    
    2 telah dieksekusi

  • Jika klausa

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    
    2 mengeksekusi , atau pernyataan, pengecualian tidak dimunculkan kembali

  • Jika pernyataan

    ... except (RuntimeError, TypeError, NameError):
    ...     pass
    
    _2 mencapai , atau pernyataan, klausa
    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    
    2 akan dieksekusi tepat sebelum eksekusi pernyataan
    >>> def this_fails():
    ..     x = 1/0
    ...
    >>> try:
    ..     this_fails()
    .. except ZeroDivisionError as err:
    ..     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero
    
    5,
    >>> def this_fails():
    ..     x = 1/0
    ...
    >>> try:
    ..     this_fails()
    .. except ZeroDivisionError as err:
    ..     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero
    
    6 atau
    >>> def this_fails():
    ..     x = 1/0
    ...
    >>> try:
    ..     this_fails()
    .. except ZeroDivisionError as err:
    ..     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero
    
    7

  • Jika klausa

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    
    2 mencakup pernyataan
    >>> def this_fails():
    ..     x = 1/0
    ...
    >>> try:
    ..     this_fails()
    .. except ZeroDivisionError as err:
    ..     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero
    
    7, nilai yang dikembalikan akan menjadi nilai dari pernyataan
    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    
    2 klausa
    >>> def this_fails():
    ..     x = 1/0
    ...
    >>> try:
    ..     this_fails()
    .. except ZeroDivisionError as err:
    ..     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero
    
    7, bukan nilai dari pernyataan
    >>> def this_fails():
    ..     x = 1/0
    ...
    >>> try:
    ..     this_fails()
    .. except ZeroDivisionError as err:
    ..     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero
    
    7 klausa
    ... except (RuntimeError, TypeError, NameError):
    ...     pass
    
    2

Sebagai contoh

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
7

Contoh yang lebih rumit

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
_8

Seperti yang Anda lihat, klausa dijalankan dalam peristiwa apa pun. Dibesarkan dengan membagi dua string tidak ditangani oleh klausa dan oleh karena itu dimunculkan kembali setelah klausa

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
2 telah dieksekusi

Dalam aplikasi dunia nyata, klausa berguna untuk melepaskan sumber daya eksternal (seperti file atau koneksi jaringan), terlepas dari apakah penggunaan sumber berhasil atau tidak.

8. 8. Tindakan Pembersihan Standar

Beberapa objek menentukan tindakan pembersihan standar yang harus dilakukan saat objek tidak lagi diperlukan, terlepas dari apakah operasi menggunakan objek berhasil atau gagal. Lihat contoh berikut, yang mencoba membuka file dan mencetak isinya ke layar

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
_9

Masalah dengan kode ini adalah membiarkan file terbuka untuk waktu yang tidak ditentukan setelah bagian kode ini selesai dijalankan. Ini bukan masalah dalam skrip sederhana, tetapi bisa menjadi masalah untuk aplikasi yang lebih besar. Pernyataan tersebut memungkinkan objek seperti file untuk digunakan dengan cara yang memastikan mereka selalu dibersihkan dengan cepat dan benar

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
_0

Setelah pernyataan dieksekusi, file f selalu ditutup, bahkan jika terjadi masalah saat memproses baris. Objek yang, seperti file, memberikan tindakan pembersihan yang telah ditentukan sebelumnya akan menunjukkan hal ini dalam dokumentasinya

8. 9. Memunculkan dan Menangani Beberapa Pengecualian yang Tidak Terkait

Ada situasi di mana perlu melaporkan beberapa pengecualian yang telah terjadi. Ini sering terjadi dalam kerangka kerja konkurensi, ketika beberapa tugas mungkin gagal secara paralel, tetapi ada juga kasus penggunaan lain yang diinginkan untuk melanjutkan eksekusi dan mengumpulkan banyak kesalahan daripada memunculkan pengecualian pertama

Builtin membungkus daftar instance pengecualian sehingga dapat dimunculkan bersama. Ini adalah pengecualian itu sendiri, sehingga dapat ditangkap seperti pengecualian lainnya

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
_1

Dengan menggunakan

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
_09 alih-alih
... except (RuntimeError, TypeError, NameError):
...     pass
4, kita hanya dapat menangani pengecualian dalam grup yang cocok dengan tipe tertentu secara selektif. Dalam contoh berikut, yang menunjukkan grup pengecualian bersarang, setiap klausa
>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
09 mengekstrak dari pengecualian grup jenis tertentu sambil membiarkan semua pengecualian lainnya menyebar ke klausa lain dan akhirnya dinaikkan kembali

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
_2

Perhatikan bahwa pengecualian yang bersarang di grup pengecualian harus berupa instance, bukan tipe. Ini karena dalam praktiknya, pengecualian biasanya adalah pengecualian yang telah dimunculkan dan ditangkap oleh program, di sepanjang pola berikut

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
_3

8. 10. Memperkaya Pengecualian dengan Catatan

Saat pengecualian dibuat untuk dimunculkan, biasanya diinisialisasi dengan informasi yang menjelaskan kesalahan yang terjadi. Ada kasus di mana berguna untuk menambahkan informasi setelah pengecualian tertangkap. Untuk tujuan ini, pengecualian memiliki metode

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
12 yang menerima string dan menambahkannya ke daftar catatan pengecualian. Render traceback standar menyertakan semua catatan, sesuai urutan penambahannya, setelah pengecualian

>>> while True:
..     try:
..         x = int(input("Please enter a number: "))
..         break
..     except ValueError:
..         print("Oops!  That was no valid number.  Try again...")
...
_4

Misalnya, saat mengumpulkan pengecualian ke dalam grup pengecualian, kami mungkin ingin menambahkan informasi konteks untuk setiap kesalahan. Berikut ini setiap pengecualian dalam grup memiliki catatan yang menunjukkan kapan kesalahan ini terjadi

Apa yang dilakukan fungsi raise di Python?

Python raise Keyword digunakan untuk memunculkan pengecualian atau kesalahan . Kata kunci kenaikan menimbulkan kesalahan dan menghentikan aliran kontrol program. Ini digunakan untuk menampilkan pengecualian saat ini dalam penangan pengecualian sehingga dapat ditangani lebih lanjut di tumpukan panggilan.

Apa tujuan dari pernyataan kenaikan gaji?

Pernyataan RAISE menghentikan eksekusi normal dari blok atau subprogram PL/SQL dan mentransfer kontrol ke pengendali pengecualian . Pernyataan RAISE dapat memunculkan pengecualian yang telah ditentukan sebelumnya, seperti ZERO_DIVIDE atau NO_DATA_FOUND , atau pengecualian yang ditentukan pengguna yang namanya Anda putuskan.

Bagaimana Anda menggunakan kenaikan gaji?

Naikkan adalah kata kerja yang harus memiliki objek dan naik digunakan tanpa objek. Ketika Anda mengangkat sesuatu, Anda mengangkatnya ke posisi yang lebih tinggi atau menaikkannya . Dia mengangkat kepalanya dari bantal. Kami terpaksa menaikkan harga. Ketika orang atau benda naik, mereka bergerak dari posisi yang lebih rendah ke posisi yang lebih tinggi. Dia bangkit dari kursi.

Apa yang terjadi saat Menaikkan pengecualian Python?

Ketika pengecualian dimunculkan, tidak ada pernyataan lebih lanjut dalam blok kode saat ini yang dijalankan . 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.