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