Yanıtlar:
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)
str( KeyError('bad'))
=> 'bad'
- istisna türü söylemiyor
print(repr(e))
; temel Exception.__str__
uygulama yalnızca özel durum iletisini döndürür, türü değil. Veya traceback
geçerli istisnayı, biçimlendirilmiş veya tam geri izlemeyi yazdırma yöntemleri olan modülü kullanın .
traceback
Modü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
error_message = traceback.format_exc()
except Exception as ex:
...
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.
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
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
(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.stdout
varsayı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 sys
Bunun çalışması için gerekli olduğunu unutmayın .) Bu şekilde, hata STDERR
yerineSTDOUT
, 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 traceback
Kedi Artı Plus'ın cevap olarak modül ve belki en iyi yol bu, ama ben orada bu dışarı atmak düşündüm.
logging
Temel print()
işlevi kullanmak yerine logging
, istisnayı günlüğe kaydetmek için daha esnek modül kullanılabilir. logging
Bu 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 RecursionError
tutucunun içinde kullanılmamalıdır (teşekkürler @PrakharPandey)
Ayrıca, aşağıdaki exc_info=True
gibi 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)
İ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'
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'
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'