【问题标题】:Can I easily tell if `Function.apply` will fail due to incorrect argument count?我可以轻松判断 `Function.apply` 是否会由于参数计数不正确而失败?
【发布时间】:2014-09-22 00:40:05
【问题描述】:

我在 Web 服务器中有一些代码可以将路由映射到处理程序中,如下所示:

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. 不涉及捕获所有异常;因为这将阻碍调试,并且用户处理代码可能会从处理程序中调用相同的错误;而且我不想干扰该错误消息

【问题讨论】:

    标签: dart


    【解决方案1】:

    您可以做的是创建一些 typedef(每个可能的签名一个),然后使用 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
    }
    

    【讨论】:

    • 不确定最后一部分是什么意思;但 typedef 的想法可能会奏效!
    • 对每个处理程序使用相同的函数签名,例如MyTestHandler(HttpRequest request, List args)
    • 哦,我明白你对数组的意思了。这会导致每个处理程序内部的实现有点笨拙(验证计数),所以我会先尝试另一个 :)
    • 这行得通;但我不能动态地处理它(甚至不是is 检查),所以我有 0-10 硬编码。这意味着
    猜你喜欢
    • 2020-04-08
    • 2011-05-09
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多