分享一个php 的异常处理程序

给大家分享一个php的异常处理程序,功能很简单当发生重大错误时,写日志并友好提示用户,用处却很大,对不对,直接上代码:

  1. <?php
  2. //exceptionHandle.php xiecongwen 20140620
  3. //define('DEBUG',true);
  4. /**
  5. * Display all errors when APPLICATION_ENV is development.
  6. */
  7. if (defined('DEBUG')) {
  8. error_reporting(E_ALL);
  9. ini_set("display_errors", 1);
  10. }
  11. if(!defined('DEBUG')){
  12. /**
  13. * 当发生重大错误时 写日志 并友好提示用户
  14. * (PS:只所以将代码写在这里,是因为在其他地方注册时,出现问题无法调用配置函数.待完善...)
  15. */
  16. function shutdownHandler()
  17. {
  18. /**
  19. * 写日志 此处直接写在根目录下shutdownlog.txt
  20. */
  21. $lasterror = error_get_last();
  22. if($lasterror){
  23. $error = strval(date("Y-m-d h:i:s")).'=>'."[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line']."\n";
  24. file_put_contents('./log/'.date("Ymd").'shutdownlog.txt',$error,FILE_APPEND);
  25. //友好提示用户
  26. ob_end_clean();
  27. die('对不起,我出错了!');
  28. }
  29. }
  30. register_shutdown_function('shutdownHandler');
  31. }
  32. if(!defined('DEBUG')){
  33. function errorHandler($errno, $errstr = '', $errfile = '', $errline = 0)
  34. {
  35. //写日志
  36. $exception = new \ErrorException($errstr, 0, $errno, $errfile, $errline);
  37. $msg = strval(date("Y-m-d h:i:s")).'=>'.'Type:'.getErrTypeName($errno).' '.getMsg($exception);
  38. file_put_contents('./log/'.date("Ymd").'error.txt',$msg,FILE_APPEND);
  39. switch ($errno)
  40. {
  41. case E_NOTICE:return ;
  42. case E_DEPRECATED:return;
  43. }
  44. throw $exception;
  45. }
  46. function getErrTypeName($errno)
  47. {
  48. switch ($errno)
  49. {
  50. case E_NOTICE:return 'E_NOTICE' ;
  51. case E_DEPRECATED:return 'E_DEPRECATED';
  52. default:return $errno;
  53. }
  54. }
  55. function exceptionHandler($ex)
  56. {
  57. $msg = strval(date("Y-m-d h:i:s")).'=>'.getMsg($ex);
  58. file_put_contents('./log/'.date("Ymd").'exception.txt',$msg,FILE_APPEND);
  59. }
  60. function getMsg($exception)
  61. {
  62. //获取最准确的异常
  63. while($exception->getPrevious())$exception = $exception->getPrevious();
  64. $msg = ' Message: '.$exception->getMessage();
  65. $msg .= ' File: '.$exception->getFile().':'.$exception->getLine()."\n";
  66. return $msg;
  67. }
  68. set_error_handler('errorHandler',E_ALL);
  69. set_exception_handler('exceptionHandler');
  70. }
  71. ?>