开发者社区 问答 正文

什么是函数计算错误的类型

用户函数在运行后,会产生两种类型的错误:

  • Handled error:用户逻辑主动捕获的错误,并通过 callback 返回
  • Unhandled error:用户逻辑未能捕获的错误,例如模块不存在,超时等等

函数计算系统会将错误信息编码为 json 字符串返回。

Handled Error


当用户捕获错误并通过 callback(err) 返回时,如果参数 err 是 Error 类型的对象,调用栈信息(stack trace)也会被返回。
  1. // User function.
  2. exports.handler = function(event, context, callback) {
  3.     var error = new Error("something is wrong");
  4.     callback(error);
  5. };
  6. // Function response.
  7. {
  8.    "errorMessage": "something is wrong",
  9.    "errorType": "Error",
  10.    "stackTrace": [
  11.        "export.handler (/var/task/index.js.3:16)"
  12.    ]
  13. }

如果 callback 参数是非 Error 类型的对象,调用栈信息将不会被返回。
  1. // User function.
  2. exports.handler = function(event, context, callback) {
  3.     callback("something is wrong");
  4. };
  5. // Function response.
  6. {
  7.    "errorMessage": "something is wrong"
  8. }


Unhandled Error


当用户逻辑未捕获到错误时,函数计算系统会尽可能捕获错误,并返回具体的信息。当遇到系统也无法捕捉的错误,例如用户函数在运行过程中突然崩溃退出,系统会返回一个通用的错误消息。

典型错误场景示例

错误类型场景示例错误消息
Handled通过 callback(err) 返回错误,其中 err 是 error 类型{“errorMessage”: “oops”, “errorType”: “Error”, “stackTrace”: [“exports.handler (/var/task/index.js:5:14)”]}
Handled通过 callback(obj) 返回错误,其中 obj 是非错误类型的对象{“errorMessage”: “oops”}
Unhandled函数依赖的模块并不存在{“errorMessage”: “Cannot find module ‘/code/X.js”}
Unhandled指定的处理函数并不存在{“errorMessage”: “Handler ‘X’ missing on module ‘Y’”}
Unhandled函数执行超时{“errorMessage”: “Task timed out after X seconds”}
Unhandled其他用户程序并处理的错误{“errorMessage”: “Process exited unexpectedly before completing request”}

展开
收起
boxti 2017-10-19 16:09:37 3308 分享
分享
版权
举报
阿里云 AI 助理回答

在阿里云函数计算(Function Compute)服务中,错误处理是确保服务稳定性和可调试性的重要环节。您提到的两种错误类型——Handled Error 和 Unhandled Error,直接关系到如何设计和优化您的函数以应对运行时的各种异常情况。

Handled Error

这类错误是指在您的函数代码中主动捕获并处理的错误。通过在代码中使用 try...catch 语句或者直接在逻辑中判断并调用 callback(err) 来处理错误,您可以自定义错误信息的格式和处理流程。当错误对象为 Error 类型时,系统会包含详细的错误信息和调用栈跟踪,这对于定位问题非常有帮助。例如:

exports.handler = async (event, context) => {
    try {
        // 可能抛出错误的代码
    } catch (error) {
        console.error(error);
        return {
            statusCode: 500,
            body: JSON.stringify({
                errorMessage: error.message,
                errorType: error.name,
                stackTrace: error.stack
            })
        };
    }
};

Unhandled Error

如果函数执行过程中发生的错误没有被您的代码捕获,这就是 Unhandled Error。这种情况下,函数计算平台会尝试捕获这些错误,并返回一个标准的错误响应。这包括但不限于模块加载失败、函数超时、找不到指定的处理函数等。由于这些错误未在用户代码层面被捕获,因此可能无法提供详细的调用栈信息,但至少会提供一个基本的错误消息来指示问题所在。对于这类错误,建议:

  • 监控与报警:利用阿里云的监控服务(如 CloudWatch)设置针对函数执行错误的报警,以便及时发现和处理。
  • 资源检查:确认函数依赖的外部资源或模块是否正确配置和可用。
  • 超时调整:根据函数实际需要处理的时间来合理设置超时时间,避免因超时导致的任务失败。
  • 日志分析:查看函数执行的日志,特别是当遇到“Process exited unexpectedly”这类模糊错误时,日志可能是唯一线索。

总之,通过细致的错误处理逻辑设计以及充分利用阿里云提供的监控和日志工具,可以有效提升函数计算应用的健壮性和可维护性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等