Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

使用throw来代替函数返回乱七八糟的结构体

  函数执行的最终结果并不是只有一个return,只是我们大多数时候都选择了return。在一些函数中我们会进行参数合法性验证,对于不合法的参数给予错误提示。但如果这样的设计也使用return就真的有点过头了。为什么不用原生态的错误处理throw呢?
  比如一个检测电子邮箱的函数,如果把具体的错误位置都检测出来,这个函数就可能有很多执行结果。如果把这些结果都通过return返回,我们可能需要在逻辑上重新定义一下这个函数的返回值类型。设计一个可以同时储存错误信息和验证状态的结构体作为它的返回值。但这个设计并没有标注,不同的两个人基本上都会设计出不同的东西,比如我可能会使用{err:错误代码,msg:错误信息}这样一个结构来作为其返回值。这对于团队开发中的其它人来说需要一个适应的成本,可能需要专门组织一个会议,让项目内的所有开发者来讨论这个问题。所以我觉得应该避免使用这样没有标准的自定义结构体。就在这个验证邮箱的例子中,我们直接使用throw来表示这个函数执行错误,并在throw中附带上错误相关的信息。而执行成功则不throwreturn一个true来表示成功。虽然在使用时需要用try语句去抓取这些错误信息,但这要比搞出一个自定义的函数返回结构体要科学的多。
function checkEMail(s){
  if(/[^@a-z0-9.-]/i.test(s))
    throw new Error("电子邮箱地址中不能包含非法字符");
  if(s.match(/@/g).length!=1)
    throw new Error("电子邮箱地址必须且只能包含一个“@”");
  if(/^@/.test(s))
    throw new Error("电子邮箱的用户名部分不能为空");
  if(/@$/.test(s))
    throw new Error("电子邮箱的域名部分不能为空");
  if(/([^a-z0-9]|^)[-.]|[-.]([^a-z0-9]|$)/i.test(s))
    throw new Error("“-”或“.”邻近的字符必须是字母或数字");
  if(!/@.+\..+$/.test(s))
    throw new Error("域名部分至少需要包含一个“.”");
  return true;
};
网名:
54.226.58.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^