我目前正在ES2015中重新制作五年前的迷宫包。我正在制作一个名为LengthError
的自定义错误,如果类型Function
的参数没有指定长度,则会抛出该错误。我只是想知道这是否是预期的行为,因为我在本地运行这个,或者如果这将延续到生产时,其他人可能会使用这个函数?
错误:
LengthError: Argument 'adjacent' must be of length 2
/home/runner/maze/index.ts:6
throw new LengthError('Argument 'adjacent' must be of length 2')
^
LengthError: Argument 'adjacent' must be of length 2
at null.generate (/home/runner/maze/index.ts:6:13)
at Object.<anonymous> (/home/runner/maze/index.ts:37:1)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
index.ts:
import { LengthError } from './errors';
export default function generate(nodes: number[], adjacent: Function, choose: Function) {
if (adjacent.length !== 2) {
try {
throw new LengthError('Argument 'adjacent' must be of length 2')
} catch(e: any) {
console.error(e.name + ': ' + e.message + 'n' + e.stack)
}
}
let node: number = choose(nodes);
let stack = [node];
let maze = new Map();
for (node of nodes) {
maze.set(node, []);
}
while (node) {
let neighbors = nodes.filter(other => !maze.get(other).length && adjacent(node, other));
if (neighbors.length) {
const neighbor = choose(neighbors);
maze.get(node).push(neighbor);
maze.get(neighbor).push(node);
stack.unshift(neighbor);
node = neighbor;
} else {
stack.shift();
node = stack[0];
}
}
return maze;
}
generate([], function a() {}, function b() {});
errors.ts:
class LengthError extends Error {
constructor(message: string) {
super(message);
this.message = message;
this.name = "LengthError";
}
}
export { LengthError };
同样,这段代码是否会在生产中显示类似的错误(其中自定义错误显示两次),并且它会指向我的文件中的同一行吗?我只是想知道这是否是预期的行为,因为我在本地运行这个,或者如果这将延续到生产时,其他人可能会使用这个函数?
是的,这就是它在本地和生产中的工作方式。这是nodejs在使用try/catch
有未捕获异常时所做的。
当你抛出错误时,你应该有其他地方的代码捕获它们并将它们转化为期望的行为。
在错误消息中,第一行是错误语句。第二组行是"堆栈跟踪"。它显示了错误在代码中的来源,包括错误发生时的当前调用堆栈。
注意,在捕获异常的代码中,您可能希望记录异常,甚至记录跟踪跟踪,然后"处理"。错误以某种方式对您的应用程序有意义(例如返回用户友好的错误消息或在API中,返回一些文档化的API错误或在http请求中,返回4xx或5xx错误状态)。