Cowboy 源码分析(二十三)

  大家好,上一篇在文章的最后我们提到cowboy_http_protocol:terminate_request/3 函数,今天我们继续往下看:

-spec terminate_request(any(), #http_req{}, #state{}) -> ok.
terminate_request(HandlerState, Req, State) ->
    HandlerRes = handler_terminate(HandlerState, Req, State),
    next_request(Req, State, HandlerRes).

  这个函数就两行代码:

  首先调用cowboy_http_protocol:handler_terminate/3 函数:

-spec handler_terminate(any(), #http_req{}, #state{}) -> ok.
handler_terminate(HandlerState, Req, #state{handler={Handler, Opts}}) ->
    try
        Handler:terminate(Req#http_req{resp_state=locked}, HandlerState)
    catch Class:Reason ->
        PLReq = lists:zip(record_info(fields, http_req), tl(tuple_to_list(Req))),
        error_logger:error_msg(
            "** Handler ~p terminating in terminate/2~n"
            "   for the reason ~p:~p~n"
            "** Options were ~p~n** Handler state was ~p~n"
            "** Request was ~p~n** Stacktrace: ~p~n~n",
            [Handler, Class, Reason, Opts,
             HandlerState, PLReq, erlang:get_stacktrace()])
    end.

  Handler:terminate(Req#http_req{resp_state=locked}, HandlerState)

  = default_handler:terminate(Req#http_req{resp_state=locked}, HandlerState)

  跟之前类似,调用 default_handler:terminate/2 函数:

terminate(_Req, _State) ->
    ok.

  简单到不能再简单的函数,当函数正确执行时,返回ok,那么如果是执行函数中有异常,那么cowboy_http_protocol:handler_terminate/3 函数就会捕获到异常。

  我们来做个测试,修改default_handler:terminate/2 函数,让它手动抛出异常,然后来跟踪下代码的执行过程,修改代码如下:

terminate(_Req, _State) ->
    throw("terminate error."),
    ok.

  如上面所示,很简单,我们添加了一行代码,throw("terminate error."), 好了,重新编译,然后运行,这里我依然使用Debugger,来断点查看下,运行情况,如下图:

  

  注意:

  < Class = throw
  < Reason = "terminate error."

  接下来,我们看下异常处理的具体逻辑:

    catch Class:Reason ->
        PLReq = lists:zip(record_info(fields, http_req), tl(tuple_to_list(Req))),
        error_logger:error_msg(
            "** Handler ~p terminating in terminate/2~n"
            "   for the reason ~p:~p~n"
            "** Options were ~p~n** Handler state was ~p~n"
            "** Request was ~p~n** Stacktrace: ~p~n~n",
            [Handler, Class, Reason, Opts,
             HandlerState, PLReq, erlang:get_stacktrace()])
    end.

  这里有几个系统函数,我们之前没接触过,这里我们按照老规矩,我们来一个一个看下:

  首先是 tuple_to_list/1 函数,这个函数比较常用,erlang doc地址:http://www.erlang.org/doc/man/erlang.html#tuple_to_list-1 从函数命名,应该很容易明白,就是将元组转成列表,下图是官方的解释,以及例子:  

  

  接下来是 tl/1 函数,返回去掉列表中第一个元素的列表,erlang doc地址:http://www.erlang.org/doc/man/erlang.html#tl-1 和上面一样,我截了个图,方便大家查看:

  

  然后看下,record_info/2 函数参考坚强2002同学的文章:http://www.cnblogs.com/me-sa/archive/2012/05/22/erlang-code-snippet-2.html

  下面是我写的测试代码:

  

  大家看看,我想应该能够对这个函数有一定的理解了吧。

  往后就是 lists:zip/2 函数,erlang doc地址:http://www.erlang.org/doc/man/lists.html#zip-2 从网上找的,关于 lists模块中的函数中文解释,地址:http://blog.csdn.net/zhangjingyangguang/article/details/7377787 谢谢这位朋友的翻译,下图是该函数的解释,很清楚:

  

  最后是 error_logger:error_msg/2 函数,向错误日志发送一个错误消息。它的参数与io:format(Format, Data)函数的参数一样,erlang doc 地址:http://www.erlang.org/doc/man/error_logger.html#info_msg-2

  

  最后是我们可以从Erlangshell看到的错误信息

  

  

  好了,这个函数就讲到这里。

  下一篇,我们将从 cowboy_http_protocol:terminate_request/3 函数的这一行继续往下看:next_request(Req, State, HandlerRes).

  最后,谢谢大家支持,晚安。

冠耕CMS详细介绍: 资源标题:冠耕CMS 精美橙色幼儿网站源码 1.7V 演示网站:http://www.guangeng.com/demo/?id=289 官方论坛:http://www.guangeng.com 关键词:冠耕CMS1.7V,冠耕教育CMS,免费cms,企业CMS,幼儿网站源码,学校网站源码 类型:asp/access 功能:单页设置 单页分类设置 新闻 视频 图片 投票 幻灯管理 友情链接管理 数据库备份 冠耕科技教育版CMS1.7V:定位学前教育机构,幼儿园等网站源码,经历艺帆CMS多年的的调研总结出使用频率最高的几大功能模块。 冠耕科技教育版CMS优势项目, 更加简约方便的后台管理设计,全自动伪静态。 特色功能:简约代码,让你的网站轻快流畅。全站DIV+CSS 自动伪静态.html结尾 关键词自动匹配设置 全面针对搜索引擎优化。图片批量上传,省去一张张上传的烦恼。 文章,图集,视频 一应俱全!扩展修改性极强! 投票功能,让你能发起各类投票,每个IP限制每天只能投票一次。 1.7版本更新内容:自动识别手机端,手机端页面投票,后台升级手机端栏目管理和幻灯管理,增加微信接口,投票可以通过关注公众号得到获得额外票数(票数后台可以管理) 冠耕CMS使用说明: 全站完整无错,如无法架设可以去官网看下教程 后台地址:/guangeng 账号:guangeng 密码:guangeng_com 冠耕CMS能快速建站!只要解压后直接上传的虚拟主机,域名解析好,设置好默认首页第一个为index.html,第二个为index.asp即可 如果你是自己的云服务!自己配置iis,那么你需要开启IIS32位支持和启用父路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值