本文介绍使用函数计算编写代码相关的基础概念信息,包括请求处理程序、函数实例生命周期回调方法、日志记录和错误处理等。
请求处理程序
在创建函数时,您需要指定请求处理程序。函数计算的运行时会加载并调用您的请求处理程序处理请求。请求处理程序包含以下两种类型:
- 事件请求处理程序 - 用于处理除HTTP触发器以外的各种事件源触发的事件请求,例如OSS触发器、SLS触发器和RocketMQ触发器等。 
- HTTP请求处理程序 - 用于处理HTTP触发器触发的请求调用。更多信息,请参见配置HTTP触发器并使用HTTP触发。 
函数实例生命周期回调方法
按量模式的函数实例可供按需创建。闲置时,按量实例会被冻结,冻结一段时间会被销毁。当实例状态发生变化时,您可以配置实例生命周期回调方法,回调实例状态。函数计算支持Initializer、PreFreeze和PreStop三种生命周期回调方法。更多信息,请参见函数实例生命周期。
Initializer回调
Initializer回调在函数实例启动成功之后,执行请求处理程序之前执行。函数计算保证在一个实例生命周期内,成功执行且只能成功执行一次Initializer回调。例如,您的Initializer回调执行失败后,系统会重新启动一个函数实例执行Initializer流程,直到成功为止,然后再执行您的请求处理程序,Initializer回调失败的实例会直接销毁。
您可以将数据库场景下连接池构建、函数依赖库加载等耗时较长的业务逻辑放到Initializer回调中,避免每次运行函数都会做重复的操作,降低函数延时。
PreFreeze回调
PreFreeze回调在函数实例冻结前执行,您可以使用PreFreeze回调完成实例冻结前的必要操作,例如,等待指标发送成功等。
PreStop回调
PreStop回调在函数实例销毁前执行,您可以使用PreStop回调完成实例销毁前的必要操作,例如,关闭数据库链接,以及上报、更新状态等。
日志记录
- 您需要配置服务级别的日志库,函数计算会将函数日志发送到指定日志库中。更多信息,请参见配置日志。 
- 通过控制台创建服务时,函数计算默认为您配置日志库。 
函数计算与日志记录集成,将函数调用的记录以及函数代码中打印的日志全部存储到日志库中。您可以使用函数计算提供的日志语句记录函数日志,方便调试及定位问题。各种编程语言的打印日志语句,如下表所示。
| 开发语言 | 编程语言内嵌的打印日志语句 | 函数计算提供的日志语句 | 参考文档 | 
| Node.js | console.log() | context.logger.info() | |
| Python | print() | logging.getLogger().info() | |
| Java | System.out.println() | context.getLogger().info() | |
| PHP | echo "" . PHP_EOL | $GLOBALS['fcLogger']->info() | |
| C# | Console.WriteLine("") | context.Logger.LogInformation() | 
使用编程语言内嵌的打印输出语句打印的日志也会被收集到日志库里,而使用函数计算提供的日志语句打印的每条日志前都会带上请求ID,方便日志的筛选。
#使用编程语言内嵌的打印输入语句打印的日志
# print('hello world')
message:  hello world
#使用函数计算提供的日志语句打印的日志
# logger.info('hello world')
message:  2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
            日志组成
函数运行日志包括服务名称、函数名称、当前执行版本、别名和代码日志。
函数运行日志数据结构如下所示:
__source__:  
__tag__:__receive_time__:  1584072413
__topic__:  myService
functionName:  myFunction
message:  2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
qualifier:  LATEST
serviceName:  myService
versionId:         - 在函数开始执行时,系统会打印 - FC Invoke Start RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650,标志函数执行开始。
- 在函数执行完成时,系统会打印 - FC Invoke End RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650,标志函数执行结束。
错误处理
函数计算的错误类型有两种,分别是HandledInvocationError和UnhandledInvocationError。 
- HandledInvocationError - 只有在Node.js中通过 - callback返回的错误是- HandledInvocationError,错误信息在响应内容中体现。- 'use strict'; module.exports.handler = function(event, context, callback) { console.log('hello world'); callback('this is error', 'hello world'); }- 响应内容如下所示: - {"errorMessage":"this is error"}
- UnhandledInvocationError - 除了 - HandledInvocationError,其余的错误都是- UnhandledInvocationError。- UnhandledInvocationError的错误- stackTrace会打印到日志中,您可以进入日志查看上下文,找到对应的- stackTrace。
操作系统环境
函数计算使用Debian9 LTS操作系统,当前仅支持x86_64架构。
您可以通过设置层或环境变量来定制操作系统环境。以时区定制为例,函数实例默认以UTC时间运行,也就是0时区,当您设置环境变量TZ的值为Asia/Shanghai后,函数计算的时区被修改为东8区,即北京时间。更多信息,请参见在函数中配置自定义层和环境变量。