代码中“抛异常”与“记录log"的思考

1 篇文章 0 订阅
1 篇文章 0 订阅

今天遇到一个关于异常的问题,记录下来关于什么时候该抛异常,什么时候应该记录log,和log中warning, notice, error的适用场合


一般来说程序遇到的问题分为硬错误和软异常。

所谓硬错误,就是代码进行不下去了,这是应该中止,这时会抛出一个异常,中断代码的进行,如下:

        if ($this->client->write($message) === false) {
            logger::log('write error', logger::error);
            throw new client_exception('cannot write to server');
        }
对于client与server进行通信的情况,抛异常一般有这么几种情况:

1 client 与 server 建立连接时失败

2 read 或 write 时socket断开了

3 通信协议出现错误:比如我们规定server应该首先会返回给我们一个"OK",然后是协议内容,如果client收到的不是OK,那么这就是一种协议错误

4 返回其他信息,这里这个其他指的是我们规定的一些返回信息,比如 -1,-100之类的,出现的场景是当client链接server1,server1有链接server2获取相关信息,但是server1与server2之间的通信出现了错误了,那么server1返回给client一个-100表示出错了,这时client应该捕获到这个错误,然后抛出一个异常,告诉用户现在系统忙

发生以上这些错误时,我们要抛异常,同时在log中使用error这一级别


对于,不影响程序按照预定流程继续进行的错误,应该记录log并使用warning这一级别,比如我们client链接后端的集群服务器,一台一台的尝试,在尝试的过程中发现某一台server无法链接时,应当记录一个warning到log中,如果所有的server都挂掉了,那么这就应该抛异常,并记录error级别的log了。


看一个例子:何时记录warning 的log和抛异常,另外在重要的地方记录notice到log中也很重要:


public function __construct($account){
        $this->account = $account;
        logger::log('connecting to server...', logger::notice);
        $all_attempts_failed = true;
        foreach (self::$servers as $server) {
            list($host, $port, $timeout) = explode(':', $server);
            $client = new tcp_socket($timeout, $timeout);
            if ($client->connect($host, $port)) {
                $all_attempts_failed = false;
                $this->client = $client;
                break;
            } else {
                logger::log('cannot connect to server: ' . $server, logger::warning);
            }
        }
        if ($all_attempts_failed) {
            $msg = 'all attempts failed to connect to server!';
            logger::log($msg, logger::error);
            throw new client_exception($msg);
        }
        logger::log('connected to server.', logger::notice);
    }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值