【问题标题】:Javascript throw vs. return error object vs. callbackJavascript 抛出与返回错误对象与回调
【发布时间】:2014-07-01 17:03:59
【问题描述】:

我正在为我的 CS 学生在课堂上使用的玩具汇编语言编写汇编程序和模拟器。我用 javascript 编写它的想法是,我可以在浏览器中构建一个简单的 UI,向学生展示每条指令如何改变机器的状态等。

我正在努力解决的一个问题是,当传递无效的汇编代码时,从汇编器返回错误信息的最佳方式。汇编器目前有一个极其简单的 API:

var assembler = ... // Get the assembler object
var valid_source = "0 mov r1 r2\n1 halt";
var valid_binary = assembler.assemble(valid_source);  // String containing 0's and 1's

var invalid_source = "foo bar baz!";
var invalid_binary = assembler.assemble(invalid_source); // What should happen here?

我对这可能如何工作有一些想法:

  1. 构造并抛出一个新的 JavaScript 错误对象。这似乎有点矫枉过正(最终可能甚至没有帮助,因为用户不会关心 javascript 堆栈跟踪等)。
  2. 返回包含错误信息的字符串或对象。然后汇编器的用户可以选择如何处理错误(如果有的话)。
  3. 将汇编器 API 改为使用回调:

    assembler.assemble(source, function(binary, error) { if (error) { // Handle the error } // Otherwise, do stuff with the binary });

  4. 完全不同的东西?

任何想法、想法或反馈都将不胜感激。

【问题讨论】:

  • 我会更改汇编程序 API,但不会通过向主回调添加新参数。添加链接某种.catch(callback) 的能力(如果.assemble() 调用中出现问题,将调用callback)。再说一次,我不确定.assemble() 到底做了什么,但是引入没有异步的回调似乎没有必要
  • 哦,有趣的想法。我没有想到这一点。是的,目前 .assemble() 只是同步解析输入字符串,所以可能不需要回调。我只是喜欢回调语法显示可能错误的方式,而不是函数在成功或失败时简单地返回不同的类型。
  • 再次查看您的#3,我想另一个想法仍然是不添加额外的错误参数,而是为assemble 提供另一个专门针对错误的回调。所以它就像assembler.assemble(source, successCallback, errorCallback)(其中successCallback 将使用二进制文件调用,或者errorCallback 将使用错误消息或其他内容调用)。然后,您在成功和失败之间有了明确的区别,并且回调代码不必进行逻辑检查。我更喜欢这个
  • 是的。那也可以。谢谢

标签: javascript assembly error-handling


【解决方案1】:

我认为您的三个选项都可以。现在从我的角度来看:

我会远离第三个选项,因为它给人的感觉是它不是异步函数。

我会选择选项 1 或 2。第一个有点矫枉过正,但我​​认为这是编译器所做的最现实的方法。退出没有零代码。但是你需要添加一个 try/catch 块来处理错误。

所以下一个选项是返回一个错误对象。对我来说似乎是最好的选择。

我建议您返回一个错误对象。很简单:

return new Error('Parsing error');

// Or with an error name
var error = new Error('Parsing error');
error.name = 'PARSING_ERROR';
return error;

使用错误对象的一个​​好处是它可以为您提供堆栈跟踪和其他方便的东西。更多信息here.

另外,要检查是否有任何错误,只需检查变量类型:

if (typeof valid_binary === 'string') { /* no error */ }

// Or

if (typeof valid_binary === 'object') { /* error */ }

祝你好运!

【讨论】:

  • 感谢您的回答。实际上,我越来越不愿意构造 javascript 错误对象(无论是否抛出),因为我倾向于认为这意味着 javascript 中的程序员错误,但实际上它代表了汇编语言中的程序员错误。也许返回带有错误信息的字符串或自定义对象是最好的方法。
  • 自定义错误对象将起作用。但是,我从 Node.js 的背景中给你我的意见,其中不是错误对象的错误是不受欢迎的。检查 Node.js 模块,它们都充满了 Error 对象。主要原因之一是因为它为您提供堆栈跟踪!
  • 是的,我也写过节点应用程序,我理解错误的用处。但我的观点是,在这种情况下,从 Error 继承实际上没有意义,因为 javascript 堆栈跟踪对于使用汇编程序的任何人来说都是无用的。即,汇编器的 javascript 实现对调试汇编代码没有用处。
猜你喜欢
  • 2018-08-31
  • 2014-03-15
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多