2013-07-08 30 views
6

Küçük bir JS kitaplığı geliştiriyordum ve orada özel Hata istisnaları kullanıyordum.JavaScript hatalarını/istisnasını genişletme

var MyError = function(){ 
    Error.prototype.constructor.apply(this, arguments); 
}; 

// Inherit without instantiating Error 
var Surrogate = function(){}; 
Surrogate.prototype = Error.prototype; 
MyError.prototype = new Surrogate(); 

// Add some original methods 
MyError.prototype.uniqueMethod = function(){...} 

zamanki miras gibi görünüyor .. Ama: (? ORLY)

Yani, bu şekilde yerli JavaScript hatası nesneden bunları miras karar! , Hata yapıcı içinde değilse -

var MyError = function(msg){ 
    this.message = msg; 
}; 

Ama sorum şu:

var err = new MyError("hello! this is text!"); 
console.log(err.message); // is giving me empty string! 

Bu here hakkında ve MDN makaleleri okudum, ama bunların hepsi bana böyle bir şey kullanmak söyleyerek mesajın nerede başlatıldığı? Birileri yerli hata yapıcısının nasıl çalıştığını bilir mi?

Teşekkürler!

P.S. Eğer ilginç - Enum.js kütüphanesi geliştiriyordum.

+1

mümkün olduğunca basit yapma ... sınırlı biraz şunlardır:) ( 'var obj = new Hata; Error.call (obj, "Merhaba, dünya!"); Bu, ya da çalışmıyor. 'Hata' tuhaftır. – Ryan

+1

@minitech: * "Hata' tuhaftır. "* +1 –

cevap

5

Yaptığınız şey iyi. Sorun olan Error. Bu satırda

:

Error.prototype.constructor.apply(this, arguments); 

... Eğer normal işlev çağrısı olarak yerine new ifadenin parçası olarak (dolaylı olarak) Error aradığınız ve defined behavior for Error when you call it as a non-constructor function yeni, boş yaratmaktır Error ve döndürün (this'u doldurmak yerine).

Şimdi, normal durumda, prototip ile yaptığınız şey, yapıcının (if (this instanceof Error)) yapıcı olarak adlandırılıp çağrılmadığının standart kontrolünü yapar. Ne yazık ki, bunu yapıyor gibi görünmüyor ve nasıl çağrıldığını belirlemek için ne kullanırsa kullanın, yapmaya çalıştığınız şey için hemen uygun görünmüyor. Hatta bu (aslında değil mi istediğiniz bir şey olması gerekiyordu sadece bir test, olan):

MyError.prototype = Error.prototype; // You wouldn't normally do this, it's just a test 

... sorunu çözmedi.

function MyError(message) { 
    var e = new Error(message); 
    // ...apply your enhancements to `e` 
    return e; 
} 

inanılmaz tatmin edici değil daha ziyade nesne üzerinde doğrudan uzantıları sokmanız gerekiyor gibidir: olası bir çözüm için

This answer to another Stack Overflow question puan (temelde, Error nesne oluşturmak ve sonra MyError o dönelim) daha prototip zincirini kullanın, ancak Error refusees top oynamak eğer, seçenekleriniz

+0

Cevabınız için teşekkürler. Öyleyse, sanki şöyle yapmam gerektiği gibi görünüyor: 'MyError = function (msg) {var err = new Error(); this.msg = msg; this.stack = err.stack; ...} – gobwas

+0

@gobwas: Yanıtı yeni bir geçici çözümle güncelledim. Sevmiyorum ama çok fazla seçenek aldığınızdan emin değilim. * Düzenle * Ya da, evet, bunu bu şekilde yapabilirsin. –

+1

çok teşekkürler, ve evet, çok fazla seçenek yok =)) – gobwas