2014-09-21 17 views
2

我有一個映射路由到處理器,這樣的web服務器的一些代碼:我可以很容易地判斷`Function.apply`是否會由於錯誤的參數計數而失敗嗎?

final Map<String, Handler> handlers = { 
    r'/index.html': StaticFileHandler('./web'), 
    r'/test/(\d+)/(\d+)': MyTestHandler 
}; 

MyTestHandler(HttpRequest request, int number1, int number2) { 
    request.response.headers.contentType = new ContentType('text', 'html'); 
    request.response.write('<h1>$number1 ($number2)</h1>'); 
    request.response.close(); 
} 

爲了支持正則表達式作爲參數,我已經提取的參數後使用Function.apply;這意味着沒有開發時間檢查或路由處理程序。如果你得到錯誤的正則表達式組數與處理程序參數;它爆炸如下:

Unhandled exception: 
Uncaught Error: Closure call with mismatched arguments: function 'call' 

NoSuchMethodError: incorrect number of arguments passed to method named 'call' 
Receiver: Closure: (HttpRequest, int) => dynamic from Function 'MyTestHandler': static. 
Tried calling: call(Instance of '_HttpRequest', "2", "3") 
Found: call(request, number) 
Stack Trace: 

這對開發人員來說並不完全明顯,出了什麼問題;所以我寧願拋出一個更容易解釋問題的自定義錯誤。

有一個簡單的辦法可以檢測到這種故障是(例如獲得的參數個數的函數的期望。):

  1. 不使用沉重的東西像鏡子
  2. 不涉及捕所有例外;因爲這會妨礙調試,並且可能會從用戶處理代碼的處理程序中調用相同的錯誤;我不想與該錯誤消息

回答

4

你可以做的是創造一些類型定義(每個可能的簽名),然後覈對他們is或者你可以傳遞參數作爲數組干涉。

這個答案包含代碼示例https://stackoverflow.com/a/22653604/217408

(抄襲)

typedef NullaryFunction(); 

main() { 
    var f = null; 
    print(f is NullaryFunction); // false 
    f =() {}; 
    print(f is NullaryFunction); // true 
    f = (x) {}; 
    print(f is NullaryFunction); // false 
} 
+0

不知道什麼是最後一部分的裝置;但typedef的想法可能會起作用! – 2014-09-21 16:35:12

+0

對每個處理程序使用相同的函數簽名,例如'MyTestHandler(HttpRequest request,List args)' – 2014-09-21 16:36:09

+0

哦,我明白你對數組的意義了。這會導致每個處理程序內的一個稍微笨拙的實現(驗證計數),所以我會嘗試其他第一個:) – 2014-09-21 16:36:11

相關問題