我正在编写一个允许用户指定正则表达式的应用程序.当然,用户会犯错误,因此我需要一种方法来处理不可解析的正则表达式,并为用户提供有关如何解决问题的可操作建议.
我遇到的问题是抛出的异常new RegExp("something awful")对regex n00bs没有帮助,并且每个浏览器都有不同的消息.例如:
鉴于:
try{
new RegExp("(pie");
}catch(e){
console.log(e.message);
}
Run Code Online (Sandbox Code Playgroud)
如果这些消息字符串是用户语言本地化的,或者它们随着时间的推移而漂移,那么这对我来说并不会让我感到惊讶,这使得这是一个疯狂的结,用exception.message解开.
我的目标是捕捉异常,弄清楚它的真正含义,并提出一个更适合初学者的消息.(最后突出显示了无与伦比的paren,在这个例子中.)
我应该使用其他一些异常标识符吗?有没有更好的方法来分辨这些?如果没有这一切,有没有人只是收集了几个最流行的浏览器中所有这些字符串的内容?
想法:在运行时弄清楚一切。例如
var tellMeWhatIDidWrong = (function() {
var tests = {
'(': 'You did not close your group... duh!',
')': 'You seem to have an unmatched parenthesis.',
'*': 'That token is illegal in that position'
};
var errors = {};
for (var i in tests) {
try { RegExp(i); } catch(e) {
errors[String(e).split(':').pop()] = tests[i];
}
}
return function(regexStr) {
try { RegExp(regexStr); } catch(e) {
e = String(e).split(':').pop();
if (e in errors) {
return errors[e];
}
return 'Unknown error';
}
return 'Nothing -- it is fine!';
};
}());
tellMeWhatIDidWrong('(abc?'); // -> "You did not close your group... duh!"
Run Code Online (Sandbox Code Playgroud)
当然,只有当浏览器的内置错误报告足够具体时,这才有效。他们中的许多人都很糟糕。例如,Opera 绝对没有给出有关该问题的任何提示,因此上述方法将无法正常工作,并且任何其他依赖于 Opera 本地错误消息的解决方案也将无法正常工作。
我建议将正则表达式发送到运行 node.js 的应用程序并获取不错的 V8 错误消息:)