Tüm işlenmemiş javascript istisnalarını yakalama


113

Bir uygulamadaki tüm işlenmemiş javascript istisnalarını bir uyarı kutusunda görüntülemenin bir yolunu bulmaya veya bulmaya çalışıyorum. Tüm bunların herhangi bir sunucu tarafı kodu kullanmadan istemci tarafında yapılmasını isterim. MVC3'ü bir ortam olarak kullanıyorum.

Son birkaç gündür araştırma yapıyorum ve tam olarak aradığımı bulamadım.

Aşağıda, neredeyse aradığım gibi görünen 2 yol buldum, ancak bu yollar, bir işlev adı içindeki tüm işlenmemiş istisnaların yığın izini yazdırmak için özel bir yönteme geçirmeniz gerekecek şekilde ayarlanmıştır. Özel fonksiyon. İşlenmemiş tüm özel durumların yığın izlemesini yazdıran özel bir yönteme bir işlev adını manuel olarak geçirmek zorunda kalmamak için bir yol arıyorum. Bu özel yöntemin tüm uygulama içindeki tüm işlenmemiş istisnaları sadece 'dinlemesini' istiyorum.

http://eriwen.com/javascript/js-stack-trace/

Ayrıca önceki bağlantıya benzer bir şey:

https://github.com/eriwen/javascript-stacktrace

Belirtilen bir javascript işlevinin yığın izlemesini yazdıran yukarıdaki 2. bağlantıdan temel kod:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Yani, bunu özetlemek gerekirse, tüm işlenmemiş javascript istisnalarını dinlemek ve ardından bunları bir uyarı kutusunda ekrana yazdırmak için bir tür 'dinleyiciye' sahip olmanın bir yolunu biliyor musunuz?

Teşekkürler! Jason


bir şey ... bir uyarı kutusu kullanmak ister miydiniz?!? console.log'u (
error_message

1
Sanırım bu soru Tüm JS hatalarını yakalama size yardımcı olacaktır
Pilgerstorfer Franz

Muhtemelen şu soruya bir göz atmalısınız: stackoverflow.com/questions/205688/…
Mark

Yanıtlar:


130

Bunu window.onerror yöntemini kullanarak yapabilirsiniz.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
Tüm uygulamamı bir dene / yakala bloğuna yerleştirmeye çalışmaktan çok daha iyi. :) Teşekkürler!
Anthony

15
Sadece bir uyarı: "Bazı / birçok hata olayının window.onerror'u tetiklemediğini, özellikle onları dinlemeniz gerektiğini unutmayın." - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
bu koda işlev adını (myErrorHandler) eklemeye gerek yoktur ... sadece işlev olabilir (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan, hata ayıklama amacıyla işlev adına sahip olmak daha iyidir. Hata ayıklayıcı, anonim bir işlev olarak göstermek yerine işlev adını kullanacaktır.
Jerinaw

Bu harika ve teşekkürler! rastgele başarısız olduğu ve ne olduğunu görmek için "konsol" veya "geliştirici" penceresinin olmadığı mobil safai dışında,% 100 iyi çalışan karmaşık bir fotoğraf yakınlaştırma komut dosyasında hata ayıklamaya çalışıyor. Elbette kendi "hata ayıklama" pencerem var, gizli bir düğmeyle açabiliyorum, ancak 'dene / yakala' yapmadığım her hatayı küresel olarak görmenin bir yolu yoktu. Bu ekleme bana sorunun tam olarak nerede olduğunu gösterdi ve saçlarımı daha fazla yırtmamı engelledi! Keşke bunu iki kez yükseltebilseydim!
Randy

48

Ya kullanabilir ya window.onerrorda (şaşırtıcı bir şekilde!) 'Error' olayını doğru şekilde bağlayabilirsiniz:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

JavaScript hatalarını takip etmek istiyorsanız Atatus'u deneyebilirsiniz . Atatus'ta çalışıyorum.


7
neden "yanlış dönüş" ifadesi alıyorsunuz?
kumaresan_sd

@kumaresan_sd, varsayılan olay işleyicisinin tetiklenmesine izin verir: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal

29

Ek olarak

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Olayı .then()dinleyen bir promise callback ( ) içinde ortaya çıkan tüm hataları da yakalayabilirsiniz.unhandledrejection

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
O ikisini de kullanmak gerekli mi window.onerrorve window.addEventListener("error"ya bunlardan biri yeterli kullanıyor?
Tormod Haugene

2
Bunlardan birini kullanabilirsiniz. Eğer kullanırsanız window.addEventListener("error", gönderme useCaptureiçin set truecatch amacıyla kabarcık kadar yoktu da elemanlar hataları. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez

1
Teşekkür ederim!! errorOlay benim özel hata yakalamak değildi. unhandledrejectionyine de anladım.
joe

throw new Error('tja');bu yaklaşımla en son
chrome'da

1
@JavierPerez v80 kullanarak test ettim, olaya yakalandım ve hemen sonrasında bir hata attım ve yakalanmadı, sözdizimi hatalarını da yakalamadı.
OZZIE

1

Check out http://log4javascript.org o Log4J dayanmaktadır. Kodunuzun çoğu, istisnaları işlemek için dene / yakala deyimlerine sarılmışsa, bu kitaplığı, çıktıyı her zaman kullanılabilir bir "iletişim kutusuna" veya son kullanıcının görebileceği günlük kaydı penceresine göndermek için ortak bir arabirim olarak kullanabilirsiniz. İletişim kutusunun içeriğini yazıcıya veya PDF'ye yazdırmak için window.print () gerçekleştiren bir düğmeye bile sahip olabilirsiniz. İyi şanslar.

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.