The default error handling in PHP is very simple.An error message with filename, line number and a message describing the error is sent to the browser.

PHP has different error handling methods:

  • Simple "die()" statements
  • Custom errors and error triggers
  • Error reporting

Using the die() function

<?php

  if(!file_exists(""a.txt)){  

    die("File not found");

  }else{

    $file = fopen("a.txt", "r");

  }

?>

Creating a Custom Error Handler

Creating a custom error handler is quite simple.We simply create a special function that can be called when an error occurs in PHP.

The function must be able to handle a minimun of 2 parameters(error level and message) but can accept up to 5 parameters(optionally: file, line-number, and the error context)

error_function(error_level, error_message, error_file, error_line, error_context);

error_level: required.Specifies the error report level for the user-defined error.Must be a value number.

error_message: required.Specifies the error message for the user-defined error.

error_file: optional.Specifies the filename in which the error occurred.

error_line: optional.Specifies the line number in which the error occurred.

error_context: optional.Specifies an array containing every variable, and their values, in use the error occurred

error_levels:

2  E_WARNING  Nonn-fatal run-time errors.Execution of the script is not halted

8  E_NOTICE  Run-time notices.The script found something that might be an error, but could also happen when running a script normally

256  E_USER_ERROR  Fatal user-generated error.This is like an E_ERROR set by the programmer using the PHP function trigger_error()

512  E_USER_WARNING  Non-fatal user-generated warning.This is like an E_WARNING set by the programmer using the PHP function trigger_error()

1024  E_USER_NOTICE  User-generated notice.This is like an E_NOTICE set by the programmer using the PHP function trigger_error()

4096  E_RECOVERABLE_ERROR  Catchable fatal error.This is like an E_ERROR but can be caught by a user define handle

8191  E_ALL  All the errors and warnings

<?php

  function customError($errno, $errstr){

    echo "<b>Error:</b>[$errno] $errstr<br>";

    echo "Ending script";

    die();

  }

?>

The default error handler for PHP is the built in error handler.We are going to make the function above the default error handler for the duration of the script.

set_error_handler("customError");

<?php

  function customError($errno, $errStr){

    echo "<b>Error:</b>[$errno] $errstr<br>";

  }

  

  set_error_handler("cutomError");

  

  echo($test); //Error: [8] Undefined variable: test

?>

In a script where users can input data it is useful to trigger errors when an illegal input occurs.In PHP, this is done by the trigger_error() function.

<?php

  $test = 2;

  if($test > 1){

    trigger_error("Value must be 1 or below");// Notice: Value must be 1 or below

  }

?>

An error type can be triggered anywhere you wish in a script, and by adding a second parameter, you can specify what error level is triggered.

Possible error types:

  • E_USER_ERROR    Fatal user-generated run-time error.Errors that can not be recovered from.Execution of the script is halted
  • E_USER_WARNING    Non-fatal user-generated run-time warning.Execution of the script is not halted
  • E_USER_NOTICE    Default.User-generated run-time notice.The script found something that might be an error, but could also happen when running a script normally

Error Logging

By default, PHP sends an error log to the server's logging system or a file, depending on how the error_log configuration is set in the php.ini file.By using the error_log() function you can send error logs to a specified or a remote destination.

<?php

  //error handler function

  function customError($errno, $errstr){

    echo "<b>Error:</b> [$errno] $errstr</br>";

    echo "Webmaster has been notified";

    error_log("Error: [$errno] $errstr", 1, "xx@xxx.com", "From: webmaster@xx.com");

  }

  set_error_handler("customError", E_USER_WARNING);

  $test = 2;

  if($test > 1){

    trigger_error("Value must be 1 or below", E_USER_WARNING);

  }

?>

Exceptions are used to change the normal flow of a script if a specified error occurs.

PHP has different error handling methods:

  • Basic use of Exception
  • Creating a custom exception handler
  • Multiple exceptions
  • Re-throwing an exception
  • Setting a top level exception handler

Basic Use of Exceptions

<?php

  function checkNum($number){

    if($number > 1){

      throw new Exception("Value must be 1 or below");

    }

    return true;

  }

  

  checkNum(2);

?>

Try, throw and catch

Proper exception code shoule include:

Try--A fucntion using an exception should be in a "try" block.If the exception does not trigger, the code will continue as normal.However if the exception triggers, an exception is "thrown"

Throw--This is how you trigger an exception.Each "throw" must have at least one "catch"

Catch--A "catch" block retrieves an exception and creates an object containing the exception information

<?php

  function checkNum($number){

    if($number > 1){

      throw new Exception("Value must be 1 or below");

    }

    return true;

  }

  try{

    checkNum(2);

    echo 'If you see this, the number is 1 or below';

  }

  catch(Exception $e){

    echo 'Message: '  .$e->getMessage();

  }

?>

Creating a Custom Exception Class

To create a custom exception handler you must create a special class with functions that can be called when an exception occurs in PHP.The class must be an extension of the exception class.

The custom exception class inherits the properties from PHP's exception class and you can ad customm functions to it.

<?php

  class customException extends Exception{

    public function errorMessage(){

      $errorMsg = 'Error on line ' .$this->getLine().'  in ' .$this->getFile(). ':<b>' .$this->getMessage(). '</b> is not a valid E-Mail address' ;

      return $errorMsg;

    }

  }

  $email = "xx@xx.....com";

  try{

    if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){

      throw new customException($email);

    }

  }

  catch(customException $e){

    echo $e->errorMessage();

  }

?>

<?php

  class customException extends Exception{

    public function errorMessage(){

      $errorMsg = 'Error on line ' .$this->getLine(). ' in ' .$this->getFile() . ': <b>' .$this->getMessage().'</b> is not  a valid Email address'.

      return $errorMsg;

    }

  }

  $email = "xxx@xx.com";

  try{

    if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){  

      throw new customException($email);

    }

    if(strpos($email, "example") !== false){

      throw new Exception("$email is an example e-mail");

    }

  }

  catch(customException $e){  

    echo $e -> errorMessage();

  }

  catch(Exception $e){

    echo $e ->getMessage();

  }

?>

<?php

  class customException extends Exception{

    public function errorMessage{

      $errorMsg =$this->getMessage().' is not a valid E-Mail address';

      return $errorMsg;

    }

  }

  

  $email = "xx@xx.com";

  

  try{

    try{

      if(strpos($email, "example") !== false)

        throw new Exception($email);

      }

    }

    catch(Exception $e){

      throw new customException($email);

    }

  }

  catche(customException $e){

    echo $e->errorMessage();

  }

?>

<?php

  function myException($exception){

    echo "<b>Exception:</b>" .$exception->getMessage();
  }

  set_exception_handler('myException');

  throw new Exception('Uncaught Exception occured');

?>

Rules for exceptions

  • Code may be surrounded in a try block, to help catch potential exceptions
  • Each try block or "throw" must have at least one corresponding catch block
  • Multiple catch blocks can be used to catch different classed of exceptions
  • Exceptions can be thrown in a catch block within a try block

Error Handling and Exception的更多相关文章

  1. TIJ——Chapter Twelve:Error Handling with Exception

    Exception guidelines Use exceptions to: Handle problems at the appropriate level.(Avoid catching exc ...

  2. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

    目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...

  3. Error Handling

    Use Exceptions Rather Than Return Codes Back in the distant past there were many languages that didn ...

  4. Clean Code–Chapter 7 Error Handling

    Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...

  5. beam 的异常处理 Error Handling Elements in Apache Beam Pipelines

    Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...

  6. Fortify漏洞之Portability Flaw: File Separator 和 Poor Error Handling: Return Inside Finally

    继续对Fortify的漏洞进行总结,本篇主要针对 Portability Flaw: File Separator 和  Poor Error Handling: Return Inside Fina ...

  7. Error handling in Swift does not involve stack unwinding. What does it mean?

    Stack unwinding is just the process of navigating up the stack looking for the handler. Wikipedia su ...

  8. WCF Error Handling

    https://docs.microsoft.com/en-us/dotnet/framework/wcf/wcf-error-handling The errors encountered by a ...

  9. ASP.NET Error Handling

    https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspn ...

随机推荐

  1. ztree edit_super

    <SCRIPT type="text/javascript"> var setting = { view : { addHoverDom : addHoverDom, ...

  2. iOS开发之——从零开始完成页面切换形变动画

    前言 某天我接到了UI发给我的两张图: 需求图.png 看到图的时候我一脸懵逼,显然我需要做一个页面切换的指示动画.老实说,从大三暑假开始做iOS开发也一年有余了,但是遇到复杂动画总是唯恐避之不及,只 ...

  3. 冲销交货单WS_REVERSE_GOODS_ISSUE

    LOOP AT ITAB. AT END OF VBELN. PERFORM FRM_LOCK_DELIVERY(ZSDS0002) USING ITAB-VBELN. CALL FUNCTION ' ...

  4. FZU 2090 旅行社的烦恼 floyd 求无向图最小环

    题目链接:旅行社的烦恼 题意是求无向图的最小环,如果有的话,输出个数,并且输出权值. 刚刚补了一发floyd 动态规划原理,用了滑动数组的思想.所以,这个题就是floyd思想的变形.在k从1到n的过程 ...

  5. POJ 3206 最小生成树

    DESCRIPTION:T_T 在下是读不懂题意的.但是捏.现在知道是求把所有的点(是字母的点)连起来的最小的权值.即最小生成树.因为求最小生成树是不计较源点是哪个的.所以可以把A和S看成一样的.首先 ...

  6. HtmlAgilityPack解析全国区号页面到XML

    需求:完成一个城市和区号的xml配置文件 处理思路:通过HtmlAgilityPack解析一个区号页面,生产xml文件 页面:http://www.hljboli.gov.cn/html/code.h ...

  7. Difference between Linearizability and Serializability

    原文:http://stackoverflow.com/questions/8200015/what-is-the-difference-between-serializability-and-lin ...

  8. [示例]NSDictionary编程题-字典的排序应用(iOS6班)

    代码: #import <Foundation/Foundation.h> static NSString * const kName = @"name"; stati ...

  9. [js]多个物体的运动

    与单个的区别:得知道哪个在动,所以运动函数需要两个参数,出了目标iTarget之外,还要obj.另外需要多个计数器,否则当一个还没运动完就移入另一个物体会发生卡壳 window.onload=func ...

  10. NOIP 2013提高组day 1 T 1转圈游戏 快速幂

    描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推 ...