2015-06-04 19 views
24

Beklenmeyen bir zaman uyumsuz çağrısından kaynaklanan hatalar yakalanabilir, özgün bir kapsülleme denemesine/yakalamaya gönderilebilir veya yakalanmamış bir istisna kaldırılabilir mi?Bekleme olmadan bir uyumsuzluktan bir hata yakalayabilir miyim?

İşte bir Yani ne örnek: Bu senaryoda

async function fn1() { 
    console.log('executing fn1'); 
} 

async function fn2() { 
    console.log('executing fn2'); 
    throw new Error('from fn2'); 
} 

async function test() { 
    try { 
     await fn1(); 
     fn2(); 
    } 
    catch(e) { 
     console.log('caught error inside test:', e); 
    } 
} 

test(); 

, fn2 atılan hata sessizce yuttu ve kesinlikle orijinal try/catch tarafından yakalanmış edilmeyecektir. Bu beklenen davranış olduğuna inanıyorum, çünkü fn2 büyük olasılıkla gelecekte bir noktada bitirmek için olay döngüsüne itiliyor ve test bittiğinde (kasıtlı olarak) umursamıyor.

try/catchfn2 içine ekleme ve hata yapmak gibi bir şey yapmadan kısa bir süre içinde böyle bir yapı tarafından yanlışlıkla yutulmadığından emin olmanın bir yolu var mı? Nasıl yakalanacağını bilmeden yakalanamayan bir hataya bile razı olurdum, bence - Yazdıklarıma göre tipik bir program akışı hatası almayı beklemiyorum, fakat yutkunma hataları onu hata ayıklama konusunda nispeten can sıkıcı hale getiriyor.

Yan not, babel-çalışma zamanı dönüşümünü kullanarak kodu iletmek ve düğümü kullanarak yürütmek için Babel kullanıyorum.

+0

Neye ulaşmaya çalıştığınızdan emin değilim, ama söz vermemek için bir neden var mı? – Tom

+1

İşlenmemiş reddetme algılamayı destekleyen bir söz kitaplığı kullanın. – Bergi

+0

Tom, pek değil, hayır. Bu noktada es7 sözdizimi ile ne yapılabileceğini görmek için vaatler yerine async/beklemeyi kullandım ve bu onunla oynarken karşılaştığım bir soruydu. Bergi, eğer şu anda başka bir seçenek yoksa (ki bu durumda şüpheliyim) geri döneceğim. – dvlsg

cevap

25

Bu örneği deneyebilirsiniz (ve zaman uyumsuz/bekliyor yerli sözler kullanır) V8 şimdi desteklenen bir özelliktir. Reddedilen bir söz işlenmediğinde hata ayıklama bilgilerini çıkarmak için en yeni Chrome'da kullanılır; deneyin the Babel REPL aşağıdaki:

Sen (biz diyoruz biz await kullanmıyorsanız çünkü) doStuff() den istisna kaybetmiş olsa bile, Krom reddedilen söz konsoluna işlenmeyen olduğunu kaydeder görüyoruz
async function executor() { 
    console.log("execute"); 
} 

async function doStuff() { 
    console.log("do stuff"); 
    throw new Error("omg"); 
} 

function handleException() { 
    console.error("Exception handled"); 
} 

(async function() { 
    try { 
     await executor(); 
     doStuff(); 
    } catch(e) { 
     handleException(); 
    } 
})() 

: o dinleme gerektirir olsa

Screenshot

Bu, aynı zamanda node.js 4.0+ mevcuttur a special unhandledRejection event için:

process.on('unhandledRejection', function(reason, p) { 
    console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason); 
    // application specific logging, throwing an error, or other logic here 
}); 
+0

Ah, mükemmel. Github ile ilgili konular için teşekkür ederiz. Onlara göz kulak olacağım ve üzerinde çalıştığım şeyi test ederken io.js'yi kullanmaya devam edeceğim. – dvlsg

+1

Ah, son bir uyarı - Süreci eklemem gerekiyordu.üzerinde ('unhandledRejection', err => {throw err;}); 'io.js için şu an beklendiği gibi çalışmasını sağlamak için [unit tests] (https://github.com/nodejs/) io.js/leke/ana/Test/paralel/test söz-işlenmeyen-rejections.js # L86). Hala biraz hacky, ama bu şekilde bir (çeşit) yararlı yığın izi ile atılan bir hata alıyorum. – dvlsg

+0

Bununla birlikte, beklemeden çağrılan bir "uyumsuzluk" işlevinden atılan bir hata yakalanamaz gibi görünüyor. Bakmanın doğru yolu bu mu? – Jehan

-6

promises hakkında bilgi sahibiseniz, bunları kullanın. Değilse, işlenmeyen ile yerli sözler reddedilen ilgilenmek :) Daha asenkron kod yapmak

function fn1(callback) { 
    console.log('executing fn1'); 
    callback({status: true}); 
} 

function fn2(callback) { 
    console.log('executing fn2'); 
    callback({status: false}); 
} 

function test() { 
    fn1(function(result) { 
     console.log('fn1 executed with status ' + result.status); 
    }); 

    fn2(function(result) { 
     console.log('fn2 executed with status ' + result.status); 
     if (result.status == false) { 
      console.log('error in fn2'); 
     } 
    }); 
} 

test(); 
+1

Yanıt için teşekkürler. Bu senaryoda kasıtlı olarak ES7 async/await kullanıyorum. Biliyorum, inatçıyım ve henüz tam olarak kabul edilmeyen özellikleri kullanıyorum, ama gerçek kodumun sözdizimini ve okunabilirliğini önemli ölçüde artırıyorlar (uzun/sonsuzdur, "async" işlevinin içindeki döngüler ise) Döngülerin içinde bekliyoruz. – dvlsg

İlgili konular