2013-10-17 14 views
0

我有一個Error的Coffeescript子類。下面的CoffeeScript腳本未設置錯誤的子類中的屬性

class MyError extends Error 
    constructor: (message, @cause) -> 
    super message 

myError = new MyError 'This is the error message!' 

console.log myError instanceof MyError 
console.log myError instanceof Error 
console.log "'#{myError.message}'" 
console.log myError.message == '' 

顯示

true 
true 
'' 
true 

下的Node.js v0.10.20。

爲什麼myError的消息屬性爲空?

+1

看看這個http://stackoverflow.com/a/10807905/1961149指向問題https://github.com/jashkenas/coffee-script/issues/2111和https://github.com/jashkenas/coffee-script/issues/1966 問題出在Error構造函數的返回值上。 –

+0

謝謝。在發佈此問題之前,我已經看到了這些鏈接。在閱讀了所有這些問題和評論之後,並且在嘗試了'instanceof'示例(這些示例都運行正常,據我所知)後,我認爲子類化沒有問題。 – k7sleeper

+0

知道'util.isError(myError)'在Node.js下返回'false',我的問題的答案是[「反對子類錯誤'的參數」](http://bjb.io/development/2012/ 05//一個參數的抵-子類-的error.html)。 – k7sleeper

回答

2

式設置@message作品

class MyError extends Error 
    constructor: (@message,@cause)-> 
    Error.captureStackTrace(@,@) 

coffee> ee=new MyError 'test' 
{ message: 'test', cause: undefined } 
coffee> "#{ee}" 
'Error: test' 
coffee> ee.message 
'test' 
coffee> ee instanceof MyError 
true 
coffee> ee instanceof Error 
true 
coffee> throw new MyError 'test' 
Error: test 
    at new MyError (repl:10:11) 
... 

super確實很好,當另一個類建立在MyError

class OError extends MyError 
    constructor: (msg)-> 
    super msg 
    @name='OError' 

下顯示正確的信息,並且是真實的util.isError,是instanceof Error,但不instanceof Error1。所以它是Error的專門構造函數,而不是「子類」。

class Error1 extends Error 
    constructor: (@message)-> 
    self = super 
    self.name = 'Error1' 
    return self 

這是node: '0.10.1', 'coffee-script': '1.6.3'

bjb.io文章最後一個例子是(在CoffeeScript中):

CustomError = (msg)-> 
    self = new Error msg 
    self.name = 'CustomError' 
    self.__proto__ = CustomError.prototype 
    return self 
CustomError.prototype.__proto__= Error.prototype 
# CustomError::__proto__= Error:: # I think 

滿足所有的測試,util.isErrorinstanceof Errorinstanceof CustomError"#{new CustomError 'xxx'}"

+0

謝謝你的詳細解答。它證實了我的結論:在CS中繼承「Error」不會導致滿足我所有要求的類:在Node.js下正確的'instanceof',正確的屬性**和**'util.isError ee == true'。閱讀「[反對繼承'Error的參數]](http://bjb.io/development/2012/05/06/an-argument-against-subclassing-error.html)」我不考慮子類化'Error'了。 – k7sleeper

+0

Thx爲新增!我的問題現在已經完全回答了!據我所知,'CustomError'滿足所有的測試,但不是一個真正的子類。我檢查了'類CustomError2擴展CustomError ...'並不能滿足所有的測試。 – k7sleeper

相關問題