如何处理未定义函数抛出的异常?

时间:2015-05-14 05:02:12

标签: javascript angularjs

在我下面的臭名昭着的验证指令中,我将所需验证函数的名称作为参数传递给基于属性的指令:

MyBigApp.directive("mlNgValidations", function ($compile) {
    var valAttributes = {
        phoneNumber: function (element) {
            element.attr("ng-pattern", "/^[0-9]+$/");
            element.attr("ng-minlength", 5);
            element.attr("ng-maxlength", 8);
        }
    }

    return {
        priority: 10000,
        terminal: true,
        link: function (scope, element, attrs) {
            var validationType = attrs.mlNgValidations;
            valAttributes[validationType](element);
            element.removeAttr("ml-ng-validations");
            $compile(element)(scope);
        }
    };
});

如果我声明一个带有错误验证功能的元素,例如:

<input type="text" class="form-control" ml-ng-validations="phooneNumber" />

我得到了非意料之外的异常:

  

TypeError:valAttributes [validationType]不是函数

我希望至少提供更多信息,最好不要定义新的异常,可能是这样的:

  

TypeError:验证函数phooneNumber未定义

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您似乎拥有调用非函数的代码:不要。一盎司的预防值得一磅治疗。

MyBigApp.directive("mlNgValidations", function ($compile) {
    var valAttributes = {
        phoneNumber: function (element) {
            element.attr("ng-pattern", "/^[0-9]+$/");
            element.attr("ng-minlength", 5);
            element.attr("ng-maxlength", 8);
        }
    }

    return {
        priority: 10000,
        terminal: true,
        link: function (scope, element, attrs) {
            var validationType = attrs.mlNgValidations;
            var fn = valAttributes[validationType];

            if (typeof fn !== "function") {
                throw new Error("Validation function " + validationType + " is not defined");
            }

            fn(element);
            element.removeAttr("ml-ng-validations");
            $compile(element)(scope);
        }
    };
});

如果您不拥有调用代码,则可以使用常规try .. catch,如果您拥有一些包含调用代码的代码。对于类似这样的事情,这似乎不太可能,而且你会遇到像Firefox window.onerror这样丑陋的浏览器特定的黑客攻击。这至少会让你捕获异常并检查它,可能会将其重新抛出为你自己的更具描述性的错误。这对我来说似乎不值得。