Soru Tek satırda birden çok özel durumu yakala (blok hariç)


Yapabileceğimi biliyorum:

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

Bunu da yapabilirim:

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

Ama eğer aynı şeyi iki farklı istisna dışında yapmak istersem, şu an düşünebildiğim en iyisi bunu yapmaktır:

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

Böyle bir şey yapmanın herhangi bir yolu var mı (her iki istisnada yapılacak eylem say please):

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

Şimdi bu gerçekten işe yaramaz, çünkü sözdizimi ile eşleşir:

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

Yani, iki ayrı istisnaları yakalama çabam tam olarak gerçekleşmedi.

Bunu yapmanın bir yolu var mı?


1963
2018-06-24 15:55


Menşei




Cevaplar:


itibaren Python Belgeleri:

Bir istisna, örneğin parantezize bir tuple olarak birden fazla istisna olarak isimlendirilebilir.

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Ya da sadece Python 2 için:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Değişkenden bir virgülle istisnayı ayırmak, Python 2.6 ve 2.7'de çalışmaya devam edecektir, ancak şimdi kullanımdan kaldırılmıştır ve Python 3'te çalışmaz; şimdi kullanmalısın as.


2712
2018-06-24 15:56



İstenen istisnaları yinelenen bir şekilde depolamak mümkün mü ve tekrarlanabilirliği yakalamak mümkün mü? Uyarılar listesini kullanarak hatalara dönüştürmeye çalışıyorum warnings.filterwarningsve iki kez uyarı listesini belirtmek istemiyorum. - BallpointBen
Denedim ... bir listve sonuçta bir TypeError. Hatalar bir tuple beklendiği gibi çalışmak için. - BallpointBen
Neden bu durumda bir tuple ihtiyaç olduğunu belgelediğini açıkça gördüğünüzde neden bir liste kullandınız? - bernie
"Parantezize tuple" nin sadece sözdizimsel mi, yoksa iyi niyetli bir tuple mı gerektiği açık değildi. "Parenthesized" yanıltıcıdır, çünkü başka bir yerde parantez olmadan bir tuple oluşturabilir ve daha sonra excepthat. Sadece oluşturulduğunda parantez içinde except hat. - BallpointBen


Tek satırda birden çok özel durumu nasıl yakalarım (blok hariç)

Bunu yap:

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

Parantez, hata nesnesini bir adaya atamak için virgül kullanan eski sözdizimi nedeniyle gereklidir. as Atama için anahtar kelime kullanılır. Hata nesnesi için herhangi bir ismi kullanabilirsiniz, tercih ederim error Şahsen.

En iyi pratik

Bunu, Python ile şu anda uyumlu ve ileri bir şekilde yapmak için, istisnaları istisna örneğine atanan Özel Durum türünü izleyerek, istisna örneğini atanmış olan önceki sözdiziminden ayırmak için İstisnaları virgülle ayırmanız ve parantezlerle sarmanız gerekir. virgül.

İşte basit kullanım örneği:

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

Hataların gizlenmesini önlemek için yalnızca bu istisnaları belirtiyorum, eğer karşılaşırsam tam yığın izlemeyi beklerim.

Bu burada belgelenmiştir: https://docs.python.org/tutorial/errors.html

Bir değişkene istisna atayabilirsiniz, (e yaygındır, ancak uzun bir istisna işleminiz varsa veya IDE'niz yalnızca benimki gibi daha büyük olan seçimleri vurguladığında daha ayrıntılı bir değişkeni tercih edebilirsiniz.) Örnekte bir args özniteliği vardır. İşte bir örnek:

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

Python 3'te, err Nesne, kapsam dışında kaldığında except blok tamamlandı.

Kullanımdan kaldırılan

Hatayı virgülle atayan kod görebilirsiniz. Bu kullanım, Python 2.5 ve önceki sürümlerde kullanılabilen tek biçimdir ve kodunuzun Python 3 ile uyumlu olmasını istiyorsanız, yeni formu kullanmak için sözdizimini güncellemeniz gerekir:

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

Kod tablonuzda virgül adı atamayı görüyorsanız ve Python 2.5 veya üzerini kullanıyorsanız, yeni sürüme geçin, böylece kodunuz yükseltdiğinizde uyumlu kalır.

suppress içerik yöneticisi

Kabul edilen cevap, minimum 4 satır koddur:

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

try, except, pass satırlar tek bir satırda ele alınabilir Python 3.4'te bulunan içerik yöneticisini bastırın:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Yani ne zaman istersen pass bazı istisnalar dışında suppress.


186
2018-06-21 04:20



En eksiksiz cevap. Nasıl kullanılacağını belirleyen tek except (KeyboardInterrupt, EOFError): sözdizimi. - Eduard Luca


Python 2.5 ve önceki sürümleri için doğru sözdizimi şöyledir:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

Nerede e Özel durum örneği.


49
2018-05-13 12:37



Uyumlu kodu ilerletmek istiyorsanız, virgülle e atanmamalısınız ve Python 2.5 artık güncellenmemektedir: mail.python.org/pipermail/python-committers/2011-October/... - Aaron Hall♦
evet, ama python 2.5 ile başka yol yok. Çözüm açıkça (eski) sürümü belirtir. - Jean-François Fabre


itibaren Python belgeleri -> 8.3 İstisnaları İşleme:

bir try deyim, belirtmek için, birden fazla bir fıkra olabilir   Farklı istisnalar için işleyiciler. En bir işleyicide olacak   idam. İşleyicileri yalnızca,   Aynı denemenin diğer işleyicilerinde değil, karşılık gelen try cümlesi   Beyan. Bir istisna, bir istisna olarak birden fazla istisna olarak adlandırılabilir.   parantezize tuple, örneğin:

except (RuntimeError, TypeError, NameError):
    pass

Bu tuple çevresindeki parantezlerin gerekli olduğunu unutmayın, çünkü   dışında ValueError, e: normalde kullanılan sözdizimi   yazılı olarak except ValueError as e: Modern Python'da (tarif edilen   altında). Eski sözdizimi, geriye dönük uyumluluk için hala desteklenmektedir.   Bunun anlamı except RuntimeError, TypeError eşdeğer değildir    except (RuntimeError, TypeError): ama except RuntimeError as TypeError: istediğin bu değil.


37
2017-10-30 10:01





Çok sayıda istisna sık kullanıyorsanız, bir tuple önceden tanımlayabilirsiniz, böylece bunları tekrar tekrar yazmak zorunda kalmazsınız.

#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

NOTLAR: 

  1. Ayrıca, diğer istisnaları da önceden tanımlı tuple, bir başka istisna bloğu tanımlamanız gerekecektir.

  2. Küresel bir değişkeni tolere edemiyorsanız, bunu ana () olarak tanımlayın. ve ihtiyaç duyulduğunda etrafından geçsin ...


15
2017-09-18 01:36





Bunu yapmanın yollarından biri ..

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. 

ve başka bir yol tarafından yürütülen görevi gerçekleştiren bir yöntem oluşturmaktır. except bloklamak ve tüm except yazdığınız bloğu ..

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]

İkinci olanın bunu yapmanın en iyi yolu olmadığını biliyorum, ama bu şeyi yapmanın birçok yolunu gösteriyorum.


5
2017-08-17 11:56





Python 2.7 Belgeleri şu şekilde ifade eder:

Bir try ifadesi, belirtmek için birden fazla bir fıkra içerebilir.   Farklı istisnalar için işleyiciler. En bir işleyicide olacak   idam. İşleyicileri yalnızca,   Aynı denemenin diğer işleyicilerinde değil, karşılık gelen try cümlesi   Beyan. Bir istisna, bir istisna olarak birden fazla istisna olarak adlandırılabilir.   parantezize tuple, örneğin:

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

Not   Bu tuple etrafındaki parantezlerin gerekli olması, çünkü   ValueError, e: normalde yazılanlar için kullanılan sözdizimi   ValueError dışında e: modern Python'da (aşağıda açıklanmıştır). Yaşlı   sözdizimi geriye dönük uyumluluk için hala desteklenmektedir. Bunun anlamı   RuntimeError hariç, TypeError istisna değildir   (RuntimeError, TypeError): ancak RuntimeError dışında TypeError olarak:   istediğin bu değil.


3
2017-12-05 14:05