我正在编写一个允许用户指定正则表达式的应用程序.当然,用户会犯错误,因此我需要一种方法来处理不可解析的正则表达式,并为用户提供有关如何解决问题的可操作建议.
我遇到的问题是新的RegExp引发的异常(“可怕的东西”)对正则表达式n00bs没有帮助,并且每个浏览器都有不同的消息.例如:
鉴于:
try{ new RegExp("(pie"); }catch(e){ console.log(e.message); }
> Firefox抛出“未终结的括号”.
> Safari抛出“失踪”)
> Chrome引发“未终止组”
如果这些消息字符串是用户语言本地化的,或者随着时间的推移它们已经漂移,那么我就不会感到惊讶,这使得这是一个疯狂的结,可以解决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!"
当然,只有当浏览器的内置错误报告足够具体时,这才能正常工作.他们中的许多人都很糟糕.例如. Opera没有提供任何关于这个问题的提示,所以上面的内容不会很好,任何其他解决方案都不会依赖Opera的本机错误消息.