2012-07-31 21 views
8

Hata raporlaması için, sahip olduğum her işlevin kodu etrafında bir try-catch sarmalayıcı eklemek istiyorum.Javascript'teki her işleve try-catch eklemenin bir yolu var mı?

Böylece temelde

function foo(arg){ 
    try { 
     bar() 
    } 
    catch(e){ 
     customErrorHandler(e) 
    } 
} 

elle tüm düzenleme olmadan tüm işlevlerine bu jenerik try-catch şeyi uygulamak için bir yolu var mı ... ile ...

function foo(arg){ 
    bar(); 
} 

değiştirmek istiyor Bunlardan mı? Örneğin, Function nesnesinin prototipini değiştirerek?

Ben bütün işlevlerini-catch denemek istiyorum Neden DÜZENLEME: Ben iOS ve Android'de yayımlama HTML5 app inşa ediyorum. Geçerli rudimentary javascript hata raporundan, uygulamanın kendi cihazımda güzel bir şekilde çalışmasına rağmen, bazı diğer cihazlarda hatalar meydana geldiğini bildirebiliyorum.

Benim amacı iki yönlüdür: bir javascript hata birinin cihazına oluşunca ...

  1. Ben app Kabaca nerede hata bilmek istiyorum mükemmel
  2. çalışmayabilir kullanıcıya bildirmek istiyorum oluştu, bu yüzden ben burada buldum gibi görünüyor,
+1

Hayır - işlev yalnızca bir deneme yakalama içermiyorsa, işlevin * çağırma * işlevini yalnızca bir yakalamada kapatabilirsiniz, ancak içeriğini değil. Buna değecek, kodunuzu try-catch ifadeleriyle batırmak oldukça kötü bir fikir. Eğer bir hata varsa, onu çözmelisiniz, bunun olmasına izin vermeyiniz, ancak bunu try-catch yoluyla bastırmalısınız. Tüm işlevlerinizi doğru şekilde denemek istediğiniz için – Utkanos

+2

+1. Yine de, hepsini manuel olarak düzenlemek zorunda kalacaksınız. – Limey

+1

Deneme yapmak çok pahalıdır. Bunu yapmak istediğine emin misin? Şartı nedir? –

cevap

9

Bu, her yerde tanımlanmış olan tüm JavaScript işlevlerini bulmanın bir yolu olmadığından, bu kolay değildir. Örneğin, böyle bir yaklaşım muhtemelen çalışma zamanında tanımlanan geri arama işlevlerini gözden kaçırır.

Ayrıca muhtemelen tüm işlevleri sarmak istemezsiniz; çünkü bu, kesinlikle sarmak istemediğiniz JavaScript kitaplıklarının tarayıcı işlevlerini ve işlevlerini içerir.

var tcWrapper = function(f) { 
    return function() { 
     try { 
      f.apply(this, arguments); 
     } catch(e) { 
      customErrorHandler(e) 
     } 
    } 
} 

Artık istediğiniz şeyi süslemek için bu işlevi kullanabilirsiniz:

bir çok daha iyi bir yaklaşım başka işlevi sarar bir işlev tanımlamak için muhtemelen.

var NS = { f: function(...) { ... } } 

Sadece özel ad alanında sarmak için tüm fonksiyonları koyun ve sonra ad üzerinde yineleme: Bazı kod güçlendirmek gitmek için gerekli

$.each(NS, function(i,n) { 
    var p = NS[n]; 
    if(typeof p === 'function') { 
     NS[n] = tcWrapper(p); 
    } 
}); 
+0

Tüm fonksiyonlar aynı 'bu' isteyecektir. Gönderdiğiniz hangi 'bu' hakkında bilinçli olmak isteyebilirsiniz. Örneğin, olay işleyicileri bazen bu olayı olay hedefi veya nesne yöntemleri olarak alırlar. Ancak, nesne özelliklerinin üstesinden gelebilir ve bunları bir nesne (Object.defineProperty ile) ile değiştirebilir ve bunları, hem bunların dışından hem de dışından kurcalanamayan bir değere düzeltebilen bir satır içi işlevde siler. onları bir deneyin yakala blokta. – nus

+0

@nus: Senin noktanı göremiyorum. Sadece bunu geçtim ama belki yanlış yapıyorum? Belki de bilgileriniz yorum yapmak için çok karmaşıktır. Bize başka bir cevapta kod ve nedenleri göstermeye ne dersin? –

+0

Üzgünüm, gördüğüm hata sadece başarısız olan işlev zaten NS'ye bağlı olduğunda gerçekleşiyor. Bir şekilde tcpWrapper bağlamında çağrıldığını düşündüm, bu durumda bu işlevi tcpWrapper'dan her işlevde sabitleyecekti. – nus

1

Tamam sorun için nereye bakılacağını bilmek: http://www.nczonline.net/blog/2009/04/28/javascript-error-handling-anti-pattern/ Temelde

, Tüm fonksiyonlar, deneme kısmındaki orijinal fonksiyona sahip bir try-catch sarmalayıcı ile değiştirilir. Hatta eğer

function callTryCatch(functionSignature) { 
    try { 
     eval(functionSignature); 
    } catch (e) { 
     customErrorHandler(e); 
    } 
} 

function entryPoint() { 
    callTryCatch(function() { 
     // do function logic 
    }); 
} 

Yine, bu saf spekülasyon olduğunu ve test etmedim ama:

+6

Blog yayınının başlığı, bunun bir anti-pattern olduğunu, yani olası ancak inovasyon olmadığını söylüyor. Sana kalmış ama gerçekten bunun iyi bir fikir olduğunu düşünmüyorum. – Utkanos

+1

Blog gönderileri anti-kalıpları tartışır, aynı zamanda çözümler gösterir. –

-3

Ben böyle bir şey yapabileceğini (bu çalıştıkları sürece bu, çok emin değilim saf spekülasyon) acaba Muhtemelen anahtarın eval deyiminde olduğunu düşünüyorum.

+3

Hiçbir zaman 'eval' kullanmayın; senin durumunda, 'apply()' istediğini yapar. –

0

, ad boşluk kullanırsanız Sarma daha basit hale gelecektir bu yüzden fortify adında bir işlev yazdım ve bir NPM modülüne yerleştirdim. Devam eden bir çalışma, ama yardımcı olmalı.

https://github.com/infinitered/over-armour

Bonus: o zaman uyumsuz fonksiyonları ile çalışır. Geri Bildirim Veriniz

İlgili konular