Python'da bir istisna nasıl yazdırılır?


Yanıtlar:


1066

Python 2.6 ve üzeri ve Python 3.x için:

except Exception as e: print(e)

Python 2.5 ve öncesi için şunu kullanın:

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'- istisna türü söylemiyor
Dave

10
keyerrors üzerindeki print (e) sadece anahtarı veriyor gibi görünüyor, ancak istisnadan daha az olan istisna mesajının tamamını vermiyor.
Veggiet

14
İstisnayı yazdıracaksanız, kullanmak daha iyidir print(repr(e)); temel Exception.__str__uygulama yalnızca özel durum iletisini döndürür, türü değil. Veya tracebackgeçerli istisnayı, biçimlendirilmiş veya tam geri izlemeyi yazdırma yöntemleri olan modülü kullanın .
Martijn Pieters

455

tracebackModül için yöntemler sağlar biçimlendirme ve istisnalar baskı ve bunların tracebacks, varsayılan işleyici yaptığı gibi istisna basacaktır bu örneğin:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

Çıktı:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

4
başka şeyler eklemek için kendi yazdırma rutinimi kullandığımı görerek yazdırabileceğim get_error_message çağrısı var.
MikeSchem

11
@MikeSchem error_message = traceback.format_exc()
heyzling

3
Teşekkür ederim, istediğim bu. Tüm hata, sadece hata türü ve mesajı değil
Ken Bellows

Bu snip, yakalanan istisna nesnesini kullanmaz. 'Ex' kullanmak için kodu genişletebilir misiniz? - olduğu gibi except Exception as ex:...
aaronsteers

@ aaronsteers yakalanan istisna kullanır; bir istisna işleyicide geçerli istisna sys.exc_info()fonksiyon üzerinden kullanılabilir ve traceback.print_exc()fonksiyon oradan alır. Bir istisnayı işlemezken veya farklı bir istisnayı temel alarak bilgi göstermek istediğinizde bir istisnayı yalnızca açık bir şekilde iletmeniz gerekir.
Martijn Pieters

169

In Python 2.6 veya üzeri biraz temizleyici:

except Exception as e: print(e)

Eski sürümlerde hala oldukça okunabilir:

except Exception, e: print e

15
Python3 içinde, "as" ile 1. yolu kullanmalısınız.
Sam Watkins

53

Hata dizelerini iletmek istiyorsanız, Hatalar ve İstisnalardan bir örnek (Python 2.6)

>>> 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 printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

38

(Bunu @ jldupont'un cevabına yorum olarak bırakacaktım, ama yeterince itibarım yok.)

Başka yerlerde de @ jldupont'un cevabı gibi cevaplar gördüm. FWIW, şunu not etmek önemlidir:

except Exception as e:
    print(e)

hata çıkışını sys.stdoutvarsayılan olarak yazdırır . Genel olarak hata işlemeye daha uygun bir yaklaşım:

except Exception as e:
    print(e, file=sys.stderr)

( import sysBunun çalışması için gerekli olduğunu unutmayın .) Bu şekilde, hata STDERRyerineSTDOUT , bu da uygun çıktı ayrıştırma / yönlendirme / vb. Sorunun kesinlikle 'bir hata yazdırmak' ile ilgili olduğunu anlıyorum, ancak sonunda daha iyi öğrenmeyen herkes için standart olmayan koda yol açabilecek bu ayrıntıyı bırakmak yerine burada en iyi uygulamayı belirtmek önemli görünüyor.

Ben kullanmadıysanız tracebackKedi Artı Plus'ın cevap olarak modül ve belki en iyi yol bu, ama ben orada bu dışarı atmak düşündüm.


1
Ayrıca flush = True eklemenizi öneririm. Ben sistemd ile (ve uygun bir günlük çerçevesi kullanarak değil) fark ettim, günlük yakalama zaman arabelleğe alma beklediğim gibi değil.
Cameron Kerr

22

Python 3: logging

Temel print()işlevi kullanmak yerine logging, istisnayı günlüğe kaydetmek için daha esnek modül kullanılabilir. loggingBu modülün sağladığı zaman damgaları ve günlüğü nerede oldu hakkında ek bilgi içeren mesajlar günlüğü çok ekstra fonksiyonellik, belirli bir günlük dosyası içine örneğin günlük iletiler. (Daha fazla bilgi için resmi belgelere bakın .)

Bir istisna günlüğü, aşağıdaki gibi modül düzeyindeki işlevle yapılabilir logging.exception():

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

Çıktı:

ERROR:root:An exception was thrown!
Traceback (most recent call last):
  File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

Notlar:

  • işlev logging.exception()yalnızca bir istisna işleyicisinden çağrılmalıdır

  • loggingönlemek için modül bir günlük RecursionErrortutucunun içinde kullanılmamalıdır (teşekkürler @PrakharPandey)


Alternatif günlük seviyeleri

Ayrıca, aşağıdaki exc_info=Truegibi anahtar kelime bağımsız değişkenini kullanarak istisnayı başka bir günlük düzeyiyle günlüğe kaydetmek de mümkündür :

logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)

1
RecursionError
Prakhar Pandey

4

Yapmak istediğiniz şey buysa, bir hata bildirimi iddia deyimleriyle yapılabilir. Bu, statik olarak düzeltilebilir kod yazmanıza ve hataları erken kontrol etmenize yardımcı olacaktır.

assert type(A) is type(""), "requires a string"

2

İstisnalar yakalanırken izleme izinden hangi bilgilerin görüntüleneceği / günlüğe kaydedileceği üzerinde oldukça fazla kontrol vardır.

Kod

with open("not_existing_file.txt", 'r') as text:
    pass

aşağıdaki izlemeyi oluşturur:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Geri izlemenin tamamını Yazdır / Günlüğe Kaydet

Diğerlerinin de belirttiği gibi, geri izleme modülünü kullanarak tüm geri izlemeyi yakalayabilirsiniz:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

Bu aşağıdaki çıktıyı üretecektir:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Aynı şeyi günlük kaydı kullanarak da yapabilirsiniz:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

Çıktı:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Yalnızca yazdırma adı / günlük hatası adı / mesajı

Geri izlemenin tamamı ile ilgilenmeyebilir, yalnızca İstisna adı ve İstisna mesajı gibi en önemli bilgilerden yararlanabilirsiniz:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

Çıktı:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.