Bagaimana cara mencetak traceback penuh tanpa menghentikan program?
Ketika Anda tidak ingin menghentikan program Anda karena kesalahan, Anda perlu menangani kesalahan itu dengan mencoba / kecuali:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Untuk mengekstrak traceback penuh, kami akan menggunakan traceback
modul dari pustaka standar:
import traceback
Dan untuk membuat stacktrace yang cukup rumit untuk menunjukkan bahwa kita mendapatkan stacktrace lengkap:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Pencetakan
Untuk mencetak traceback penuh, gunakan traceback.print_exc
metode ini:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Yang mencetak:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Lebih baik daripada mencetak, masuk:
Namun, praktik terbaik adalah membuat logger diatur untuk modul Anda. Ia akan mengetahui nama modul dan dapat mengubah level (di antara atribut lainnya, seperti penangan)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
Dalam hal ini, Anda akan menginginkan logger.exception
fungsinya sebagai gantinya:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Log mana:
ERROR:__main__:something bad happened!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Atau mungkin Anda hanya menginginkan string, dalam hal ini, Anda akan menginginkan traceback.format_exc
fungsinya sebagai gantinya:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Log mana:
DEBUG:__main__:Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Kesimpulan
Dan untuk ketiga opsi ini, kami melihat kami mendapatkan output yang sama seperti ketika kami memiliki kesalahan:
>>> do_something_that_might_error()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
print(sys.exc_info()[0]
cetakan<class 'Exception'>
.