PHP Exception 异常处理和 exit/die

一直很难理解异常处理,比如我的程序底层使用了mysql数据库连接,而且我的上层所有程序都建立在此基础上(不考虑缓存等其他),比如一个页面要取出当前url中id指定的post内容,当调用底层数据库连接时,结果mysql_connect无法连接,那建立在此基础上的应用也再没有执行的必要了,我的mysql_connect处不应该直接exit/die终止程序吗?即使说要友好的错误提示,那我可以自定义一个函数比如MyError($code),在此函数中来美化我的输出再在里面决定要不要exit/die啊。
如果使用异常处理,那在我觉得所有可能出现不正确的地方,我都必须加上try/catch了?那我的一段程序下来岂不是一堆try/catch...这和我直接用die/exit或者调用自定义MyError()有何分别?如果说Exception可以往上传递,但我很多时候就应该当即处理啊,就比如数据库连不上,或者我include系统配置的时候文件不存在,这个时候难道不应该当即做出处理吗?
比如我做了单入口,Router->Controllers->Services/Models->ModelBase->DbFactory->MySQL->Driver,是不是我在Router外面加个try/catch就可以了,里面全都throw?比如我的MySQL中mysql_connect出现问题了,我的Controller里面在get取id时,url中的id在数据库中不存在,那这两处我都要try/catch/throw,然后在Router外面的catch中再处理吗?
实在是很混乱,求解答,手册都是教怎么用,没教应用场景,还有为什么要用?(那个为什么真心看不出为什么),求指点!能指出具体的应用场景最好了,谢谢~
2015-06-19
很感谢各位的详细回答,谢谢!还有一些问题想麻烦各位,写到评论里不太好,就拿来写到这里了。
比如配置文件丢失这个问题,处理的方法:
1、最原始的直接require,这样配置文件不存在就直接报错了(报错打开),这样显然不合适,不友好而且会暴露物理路径。
2、我已经预先意识到了require可能会出现问题,所以决定在require之前先is_file/file_exists判断文件是否存在,那么:
$file='/a/b/c.php';
is_file($file)ordie('configfilenotfound');
require($file);
或者
$file='/a/b/c.php';
try{
is_file($file)orthrownewException('configfilenotfound');
}catch(Exception$e){
//todo
}
require($file);
第一个代码可能简陋了点,不多那个die可以换成自定义错误提示函数,也可以输出友好的错误信息。
那第二个代码有什么好处呢?是不是我在//todo处依旧抛出这个$e,或者干脆这里不要try/catch了?假设我是单入口,最后整个系统的Exception都交给最上一层处理?
1、那依照分层处理的概念,现在就假设config这段代码为“config层”,首先可以肯定的是我的“Dispatcher层”、“Controller层”、“DB层”、“Model层”统统依赖于它,难道说我要这些层自己各自去处理这个异常吗?还是说这些层都各自再throw出去?或者这些层统统不管(我才不管呢,谁最后谁管)?这种“config层”一对多为其它层服务,那“config层”在配置文件丢失的时候不应该自己就处理掉吗?这不也符合异常尽量不扩散吗?
2、由“config层”自己处理的话,那//todo处理的时候不也应该exit/die吗?否则岂不是又去执行require了?
3、那如果它自己exit/die掉了,这个时候异常的好处不就仅仅是比我自定义的MyError多了trace信息吗?
HUX布斯
浏览 272回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript