当你急着下班跟妹子约会的时候,你会发现try catch其实是个好东西,
基于try catch的异常处理机制,比较灵活,比较强大,也比较重。事物都有双面性。
try catch 的代价比较大。相对于判断返回值,跑出异常到捕获,需要更多的cpu指令和代码,比如回溯stack检查是否有异常捕获。具体如何实现,可以研究下。
try catch的好处是什么?可以携带完整的出错信息。比如出处,错误类型,错误的具体原因等。
此外异常还可逆调用链条传递,对异常处理来说可以灵活,即你可以不处理而直接告诉上层。但是应该的自己关心的异常在本层处理掉。同时可以对此异常封装便于纪录根本出错,然后重新抛出。这些你返做会很累而且不清晰。
对于编程实践,我觉得,异常应该少用,除非是这种错误会很少出现,即,一旦出现是一种严重的错误,那么抛出异常是合理的。否则用返回码来标志。
明显异常是一种不可或缺的编程元素,是将编程中“错误”进行更加精密和正规对待的方式。认识到错误也是编程的重要组成,而不仅仅是附属品。这很关键.
任何范式和特性都不能滥用,都不能依赖语言而进行懒惰式,逃避式编程。
要写出优秀的程序,是要斟酌和将语言特性视为工具,择而用之。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//下面是一个小例子, 如果是因为文件已经存在,导致失败,会抛出FileExistedException,这个Exception的Msg属性为"文件【C:\abc.txt】已经存在。如果需要覆盖,请添加参数:arg_overwrite = true"。 //如果是因为创建文件发生超时,导致失败,会抛出TimeoutException,这个Exception的Msg属性为"在创建文件时超时,请使用chkdsk检查文件系统是否存在问题。"。 可见,上述机制,实际上是用不同的Exception代替了【3】的State。 这种机制,在外层使用时: try { ....CreateFile( "C:\abc.txt" ); } catch( AccessException e ) { ....//代码进入这里说明发生【没有权限错误】 } catch( FileExistedException e ) { ....//代码进入这里说明发生【文件已经存在错误】 } catch( TimeoutException e ) { ....//代码进入这里说明发生【超时错误】 } |
下面是PHP的一个小栗子
1 2 3 4 5 6 7 8 9 10 11 |
<?php try { if (file_exists('test_try_catch.php')){ require ('test_try_catch.php'); }else{ throw new Exception('我并没有找到这个文件啊~'); } }catch(Exception $e) { echo $e->getMessage(); } ?> |