Pertanyaan Tangkap beberapa pengecualian dalam satu baris (kecuali blok)


Saya tahu yang bisa saya lakukan:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

Saya juga bisa melakukan ini:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

Tetapi jika saya ingin melakukan hal yang sama di dalam dua pengecualian yang berbeda, yang terbaik yang dapat saya pikirkan saat ini adalah melakukan ini:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

Apakah ada cara yang dapat saya lakukan seperti ini (karena tindakan yang diambil dalam kedua pengecualian adalah untuk say please):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

Sekarang ini benar-benar tidak berfungsi, karena cocok dengan sintaks untuk:

try:
    # do something that may fail
except Exception, e:
    # say please

Jadi, usaha saya untuk menangkap dua pengecualian itu tidak benar-benar terjadi.

Apakah ada cara untuk melakukan ini?


1957
2018-06-24 15:55


asal


Jawaban:


Dari Dokumentasi Python:

Kecuali klausa dapat menyebutkan beberapa pengecualian sebagai tuple yang disisipkan, misalnya

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Atau, untuk Python 2 saja:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Memisahkan pengecualian dari variabel dengan koma akan tetap bekerja dengan Python 2.6 dan 2.7, tetapi sekarang tidak lagi digunakan dan tidak berfungsi dengan Python 3; sekarang Anda harus menggunakan as.


2698
2018-06-24 15:56



Bagaimana cara menangkap beberapa pengecualian dalam satu baris (kecuali blok)

Melakukan hal ini:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

Tanda kurung diperlukan karena sintaks yang lebih tua yang menggunakan koma untuk menetapkan objek kesalahan ke nama. Itu as kata kunci digunakan untuk penugasan. Anda dapat menggunakan nama apa pun untuk objek kesalahan, saya lebih suka error sendiri.

Praktek terbaik

Untuk melakukan ini dengan cara yang saat ini dan maju kompatibel dengan Python, Anda perlu memisahkan Pengecualian dengan koma dan membungkusnya dengan tanda kurung untuk membedakan dari sintaks sebelumnya yang menugaskan instance eksepsi ke nama variabel dengan mengikuti tipe Exception agar ditangkap dengan koma.

Berikut ini contoh penggunaan sederhana:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

Saya hanya menetapkan pengecualian ini untuk menghindari menyembunyikan bug, yang jika saya temui, saya mengharapkan jejak stack penuh dari.

Ini didokumentasikan di sini: https://docs.python.org/tutorial/errors.html

Anda dapat menetapkan pengecualian ke variabel, (e adalah umum, tetapi Anda mungkin lebih memilih variabel verbose jika Anda memiliki penanganan eksepsi yang panjang atau IDE Anda hanya menyoroti pilihan yang lebih besar dari itu, seperti yang saya lakukan.) Instance memiliki atribut args. Berikut ini contohnya:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

Perhatikan bahwa dengan Python 3, the err objek jatuh dari ruang lingkup ketika except blok disimpulkan.

Tidak berlaku lagi

Anda mungkin melihat kode yang menetapkan kesalahan dengan koma. Penggunaan ini, satu-satunya formulir yang tersedia di Python 2.5 dan sebelumnya, sudah ditinggalkan, dan jika Anda ingin kode Anda untuk maju kompatibel dengan Python 3, Anda harus memperbarui sintaks untuk menggunakan formulir baru:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

Jika Anda melihat tugas nama koma dalam basis kode Anda, dan Anda menggunakan Python 2.5 atau lebih tinggi, beralihlah ke cara baru untuk melakukannya sehingga kode Anda tetap kompatibel saat Anda meningkatkan.

Itu suppress manajer konteks

Jawaban yang diterima adalah benar-benar 4 baris kode, minimum:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Itu try, except, pass baris dapat ditangani dalam satu baris dengan menekan pengelola konteks, tersedia dalam Python 3.4:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Jadi kapan Anda mau pass pada pengecualian tertentu, gunakan suppress.


184
2018-06-21 04:20



Untuk python 2.5 dan versi sebelumnya, sintaks yang benar adalah:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

Dimana e adalah instance Exception.


49
2018-05-13 12:37



Dari Dokumentasi Python -> 8.3 Penanganan Pengecualian:

SEBUAH try pernyataan mungkin memiliki lebih dari satu kecuali klausa, untuk menentukan   penangan untuk pengecualian yang berbeda. Paling banyak satu handler akan   dieksekusi. Penangan hanya menangani pengecualian yang terjadi di   klausa percobaan yang sesuai, tidak pada penangan lain dari percobaan yang sama   pernyataan. Kecuali klausul mungkin menyebutkan beberapa pengecualian sebagai a   tupel yang disisipkan, misalnya:

except (RuntimeError, TypeError, NameError):
    pass

Perhatikan bahwa tanda kurung di sekitar tupel ini diperlukan, karena   kecuali ValueError, e: adalah sintaks yang digunakan untuk apa yang biasanya   ditulis sebagai except ValueError as e: dalam Python modern (dijelaskan   di bawah). Sintaks yang lama masih didukung untuk kompatibilitas mundur.   Ini berarti except RuntimeError, TypeError tidak setara dengan    except (RuntimeError, TypeError): tapi untuk except RuntimeError as TypeError: yang bukan yang Anda inginkan.


37
2017-10-30 10:01



Jika Anda sering menggunakan sejumlah besar pengecualian, Anda dapat menentukan tuple terlebih dahulu, jadi Anda tidak perlu mengetik ulang berkali-kali.

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

CATATAN: 

  1. Jika Anda, juga, perlu menangkap pengecualian lain daripada yang ada di tuple yang sudah ditentukan sebelumnya, Anda harus menentukan yang lain kecuali blok.

  2. Jika Anda tidak bisa mentoleransi variabel global, tentukan di main () dan menyebarkannya di mana diperlukan ...


15
2017-09-18 01:36



Salah satu cara untuk melakukan ini adalah ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

dan cara lain adalah membuat metode yang melakukan tugas yang dijalankan oleh except memblokir dan memanggilnya melalui semua except blokir yang Anda tulis ..

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

Saya tahu bahwa yang kedua bukan cara terbaik untuk melakukan ini, tetapi saya hanya menunjukkan sejumlah cara untuk melakukan hal ini.


5
2017-08-17 11:56



Dokumentasi Python 2.7 menyatakan bahwa:

Pernyataan percobaan mungkin memiliki lebih dari satu kecuali klausa, untuk menentukan   penangan untuk pengecualian yang berbeda. Paling banyak satu handler akan   dieksekusi. Penangan hanya menangani pengecualian yang terjadi di   klausa percobaan yang sesuai, tidak pada penangan lain dari percobaan yang sama   pernyataan. Kecuali klausul mungkin menyebutkan beberapa pengecualian sebagai a   tupel yang disisipkan, misalnya:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

Catatan   bahwa tanda kurung di sekitar tupel ini diperlukan, karena kecuali   ValueError, e: adalah sintaks yang digunakan untuk apa yang biasanya ditulis sebagai   kecuali ValueError sebagai e: di Python modern (dijelaskan di bawah). Yang lama   sintaks masih didukung untuk kompatibilitas mundur. Ini berarti   kecuali RuntimeError, TypeError tidak sama dengan kecuali   (RuntimeError, TypeError): tetapi kecuali RuntimeError sebagai TypeError:   yang bukan yang Anda inginkan.


3
2017-12-05 14:05