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:
這對開發人員來說並不完全明顯,出了什麼問題;所以我寧願拋出一個更容易解釋問題的自定義錯誤。
有一個簡單的辦法可以檢測到這種故障是(例如獲得的參數個數的函數的期望。):
- 不使用沉重的東西像鏡子
- 不涉及捕所有例外;因爲這會妨礙調試,並且可能會從用戶處理代碼的處理程序中調用相同的錯誤;我不想與該錯誤消息
不知道什麼是最後一部分的裝置;但typedef的想法可能會起作用! – 2014-09-21 16:35:12
對每個處理程序使用相同的函數簽名,例如'MyTestHandler(HttpRequest request,List args)' – 2014-09-21 16:36:09
哦,我明白你對數組的意義了。這會導致每個處理程序內的一個稍微笨拙的實現(驗證計數),所以我會嘗試其他第一個:) – 2014-09-21 16:36:11