Javascript'te bir istisnayı nasıl yeniden atıp yığını koruyabilirim?


154

Javascript'te, bir istisna meydana geldiğinde biraz temizlik yapmak istediğimi, ancak istisnanın yığını yaymaya devam etmesine izin verdiğimi varsayalım, örneğin:

try {
  enterAwesomeMode();
  doRiskyStuff(); // might throw an exception
} catch (e) {
  leaveAwesomeMode();
  throw e;
}
doMoreStuff();
leaveAwesomeMode();

Bu kodla ilgili sorun, istisnayı yakalamanın ve yeniden atmanın, o noktaya kadar yığın izleme bilgilerinin kaybolmasına neden olmasıdır, böylece istisna daha sonra tekrar yakalanırsa, yığında daha yukarılarda, yığın izleme yalnızca yeniden -atmak. Bu berbat çünkü aslında istisnayı atan işlevi içermediği anlamına geliyor.

Görünüşe göre, try..finally aynı davranışa sahip, en azından Chrome'da (yani, sorun tam olarak yeniden atma değil, herhangi bir istisna işleyici bloğunun varlığıdır.)

Javascript'te bir istisnayı yeniden atmanın ancak bununla ilişkili yığın izini korumanın bir yolunu bilen var mı? Başarısız olursa, istisna korumalı temizleme işleyicileri eklemenin diğer yolları için önerilere ne dersiniz?

Herhangi bir işaretçi için teşekkürler :)


Yanıtlar:



25

Bir Error nesnesinin stack özelliği, atıldığı noktada değil, Error nesnesinin kendisiyle aynı anda oluşturulur. Deyim nedeniyle genellikle aynıdırlar

   yeni Hata ("mesaj") at;

Eğer bunu yazdım gibi kod kullanıyorsanız ve yığın özelliği olacak değil hatayı yeniden atmanızı zaman değiştirilebilir.


6
Bu doğru değil (belki platforma bağlı). Şimdi kullandığım js motoru (Rhino), orijinal yığını kaybederek atış ifadesindeki yığını sıfırlar.
Ted Bigham

1
Belki öyledir, ancak gergedan-1.7.7.2.jar bunu değiştirmez. Hangi sürümü kullanıyorsunuz?
Mike Stay
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.