以下是一个示例代码,展示了如何在Alexa超时后发送SessionEndedRequest,并向用户显示错误卡片:
from ask_sdk_core.skill_builder import SkillBuilder
from ask_sdk_core.dispatch_components import (
AbstractRequestHandler, AbstractExceptionHandler)
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_model import Response
class TimeoutRequestHandler(AbstractRequestHandler):
def can_handle(self, handler_input: HandlerInput) -> bool:
return (handler_input.request_envelope.request.object_type ==
"SessionEndedRequest" and
handler_input.request_envelope.request.reason ==
"ERROR" and
handler_input.request_envelope.request.error.type ==
"INVALID_RESPONSE")
def handle(self, handler_input: HandlerInput) -> Response:
# 发送SessionEndedRequest
return handler_input.response_builder.set_response(None).response
class CustomExceptionHandler(AbstractExceptionHandler):
def can_handle(self, handler_input: HandlerInput, exception: Exception) -> bool:
return True
def handle(self, handler_input: HandlerInput, exception: Exception) -> Response:
# 显示错误卡片
speech_text = "哎呀,好像出了点问题,请稍后再试。"
handler_input.response_builder.speak(speech_text).set_card(
SimpleCard("错误", speech_text)).set_should_end_session(True)
return handler_input.response_builder.response
sb = SkillBuilder()
# 添加请求处理程序和异常处理程序
sb.add_request_handler(TimeoutRequestHandler())
sb.add_exception_handler(CustomExceptionHandler())
# 构建并部署技能
lambda_handler = sb.lambda_handler()
这个例子中,我们定义了一个TimeoutRequestHandler类,它继承自AbstractRequestHandler。在can_handle方法中,我们检查请求是否是超时错误(INVALID_RESPONSE),如果是,则返回True。在handle方法中,我们通过设置响应为None来发送SessionEndedRequest。
我们还定义了一个CustomExceptionHandler类,它继承自AbstractExceptionHandler。在can_handle方法中,我们返回True,以便处理所有异常情况。在handle方法中,我们设置了一个错误卡片,并返回一个包含错误信息的响应。
最后,我们使用SkillBuilder类创建一个技能,并将TimeoutRequestHandler和CustomExceptionHandler添加为请求处理程序和异常处理程序。最后,我们将lambda_handler作为AWS Lambda函数的入口。