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

来源:互联网 发布:淘宝双十一数据分析 编辑:程序博客网 时间:2024/05/16 07:03

今天遇到一个关于异常的问题,记录下来关于什么时候该抛异常,什么时候应该记录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);    }



原创粉丝点击