2015-07-17 21 views
31

Bir javascript Sözünde yer alan tüm işlenmemiş istisnaları/retleri yakalamak istiyorum. Promise zincirinin her bir ucuna .catch(..) eklemeden onları yakalamak için iyi bir yöntem var mı? (Bunu eklemeyi unutma durumunda, hata sessizce kaybolur).Tüm işlenmemiş javascript vaatlerini reddetme

Google Chrome'daki geliştirici konsolu bunları kaydedebilir, bunları bir üretim ortamında da kaydetmeyi seviyorum.

Normal javascript istisnaları için window.onerror işlevini kullanıyorum, ancak Promise'deki hatalar bu işlevi çağırıyor.

Örnek:

window.onerror = function (e) { 
    alert("unhandled error: " + e); 
}; 

var p = new Promise(function (resolve, reject) { 
    var nullObject = null; 
    // Raise a TypeError: Cannot read property 'forceNullError' of null 
    var x = nullObject.forceNullError(); 
    resolve(); 
}); 

p.then(function() { alert('success'); }); 

JSFiddle: https://jsfiddle.net/f7zwej6L/

*) Ben WinJS ne istiyorum için .done(..) yöntemi olduğunu fark, ancak Yerli Sözler yok.

+0

'.done 'ile eşdeğerdir.o zaman (bitti, bitti), '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'işlevini yerine getirdikten sonra, cevabınız için çok teşekkür ederim ( –

+0

@JaromandaX). Bunu MSDN'de bulduğum "İşlevi olmayan işlevler, söz konusu işlevin bir parçası olarak sessizce yakalanır, ancak işlenen işlevdeki işlenmemiş özel durumlar atılır." [Msdn] (https://msdn.microsoft.com/en-us/library/windows/apps/hh700337.aspx). –

+0

Hayır, '.done **, ** .then (bitti, bitti)' ye eşdeğer değil. Http://stackoverflow.com/questions/26667598/will-javascript-es6-promise-support-done-api/26667655#26667655 adresine bakın. –

cevap

54

Tüm dünya unhandledrejection ve rejectionhandled olaylarını bekliyor. Mart 2016 itibarıyla, Chrome bunu destekleyen ilk kişi oldu.

Örnek:

window.addEventListener('unhandledrejection', function(event) { 
    console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').'); 
}); 

Şartname: HTML Living Standard

Mozilla Geliştirici: onrejectionhandled, onunhandledrejection

Krom Sorunlar: 495801, 393913

+0

Halihazırda Chromium'un gövdesindeymiş gibi görünüyor ve Firefox da bunu gerçekten uygulamak istiyor. Çok yakında sunulacağını düşünüyorum. –

+1

Etkinliğin adını "işlenmemiş" olarak düzeltmek için düzenleyin ve Chrome'un artık desteklediğinden (woot!) Bahset. "window.onunhandledrejection" özellik sürümüdür. Bluebird kullanan herkes için –

+1

FYI, "unhandledrejection" olayı tetiklenir, _but_ söz ve olayın "detay" anahtarının altında yuvalanır (ör. "Event.promise" yerine "event.promise"). Http://bluebirdjs.com/docs/api/error-management-configuration.html#global-rejection-events – Nathan

3

Bazı kitaplıkların bunu yapmak için kendi API'leri vardır. Bazı tarayıcılar işlenmemiş redleri (er ya da geç) bildirecektir.

Gerçekte,büyük olasılıkla ne yaparsa onu yapar. Bu nedenle bu özelliklerin bir parçası değildir. Her halükarda, onu hala hatırlamak zorundasınız.

Bunu yapmanın güvenilir, platformlar arası, çapraz kütüphane yolu yok.

0

uncaught library Promi işlenmeyen yakalamak için size yardımcı olabilir se retleri.

Ayrıca, yakalanmamış hataları da ele alır. Bu yaklaşımın

DÜZENLEME

<script type="text/javascript" src=".../uncaught/lib/index.js"></script> 

<script type="text/javascript"> 
    uncaught.start(); 
    uncaught.addListener(function (error) { 
     console.log('Uncaught error or rejection: ', error.message); 
    }); 
</script> 

Fayda Eğer yakalanmamış hataları ve işlenmeyen söz ret hem işlemesine olanak tanır tek arayüz vardır. Düğüm olay unhandledRejection denir

+0

Ancak, aynı "unhandledrejection" etkinliğine dayanarak desteklenen tarayıcılar: Google Chrome 49+, Opera 41+, Yandex.Browser 16+. –

+0

Evet, haklısınız. Bu yaklaşımın temelinde özel bir şey yok. Sadece 'unhandledrejection' ve 'error' olaylarını kullanarak basitleştirir. –

8

Not:

sürümünde
process.on('unhandledRejection', function(err, promise) { 
    console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').'); 
}); 

8+, düğüm bu ret üzerine sona erer.