2012-08-31 25 views
7

Sanırım, bir şeyin nasıl olması gerektiğini tanımlamak için kullanıldığını iddia ettiğim bir python programım var ve AssertionError'a atılmak yerine okuma-değerlendirme döngüsü ile anormallikleri yakalamak istiyorum.Hata ayıklama pythonunu AssertionError üzerinde zorlayabilir miyim?

Ben

if (reality!=expectation): 
    print("assertion failed"); 
    import pdb; pdb.set_trace(); 

olabilir, Verilen ama bu çok daha çirkin bir düz assert(reality==expectation) daha kodunda bu.

except: bloğunda üst düzeyde pdb.set_trace() olarak adlandırılmış olabilir, ancak daha sonra başarısızlığın tüm içeriğini kaybederdim, değil mi? (Yani, stacktrace istisna nesnesi, ancak argüman değerleri değil, kurtarılabilir)

Python3 yorumlayıcısını ihtiyacım olana çevirebilecek --magic komut satırı bayrağı gibi bir şey var mı?

+0

eclipse kullanın ve bir kesme noktası ile hata ayıklama modunda çalıştırın? –

+0

@JoranBeasley: Her zaman bir IDE'niz yok. ör., bir ssh kabuğuna bağlandığınızda. – Constantinius

+1

sonra pdb komut satırından kullanın ve kesme noktalarını kullanın ... http://www.doughellmann.com/PyMOTW/pdb/ 'python -m pdb somescript.py' sizin' --magic' olan –

cevap

4

nose projesine bir göz atın. Hatalarda hata ayıklayıcısına bırakmak için --pdb option ile kullanabilirsiniz.

+0

Sanırım birim testi yapan kişiler için bu çok kullanışlı, ama burada yaptığım şey bu değil. – PypeBros

11

Esas this great snippet alınan: Bu kodunuzu hazrlarken

import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or type != AssertionError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

, tüm AssertionError s Pdb çağırmak gerekir.

+0

bunu deneyecek ... – PypeBros

+0

Burada "post-mortem modu" nun zorunlu olduğunu varsayalım ve pdb.set_trace() 'nin herhangi bir yararı olma ihtimali yoktur, değil mi? – PypeBros

+0

Aslında emin değilim, sanırım denemelisin. – Constantinius

İlgili konular