PHP Òì³£´¦Àí

Òì³££¨Exception£©ÓÃÓÚÔÚÖ¸¶¨µÄ´íÎó·¢Éúʱ¸Ä±ä½Å±¾µÄÕý³£Á÷³Ì¡£

ʲôÊÇÒì³££¿

PHP 5 ÌṩÁËÒ»ÖÖеÄÃæÏò¶ÔÏóµÄ´íÎó´¦Àí·½·¨¡£

Òì³£´¦ÀíÓÃÓÚÔÚÖ¸¶¨µÄ´íÎó£¨Òì³££©Çé¿ö·¢Éúʱ¸Ä±ä½Å±¾µÄÕý³£Á÷³Ì¡£ÕâÖÖÇé¿ö³ÆÎªÒì³£¡£

µ±Òì³£±»´¥·¢Ê±£¬Í¨³£»á·¢Éú£º

  • µ±Ç°´úÂë״̬±»±£´æ
  • ´úÂëÖ´Ðб»Çл»µ½Ô¤¶¨ÒåµÄÒì³£´¦ÀíÆ÷º¯Êý
  • ¸ù¾ÝÇé¿ö£¬´¦ÀíÆ÷Ò²Ðí»á´Ó±£´æµÄ´úÂë×´Ì¬ÖØÐ¿ªÊ¼Ö´ÐдúÂ룬ÖÕÖ¹½Å±¾Ö´ÐУ¬»ò´Ó´úÂëÖÐÁíÍâµÄλÖüÌÐøÖ´Ðнű¾

ÎÒÃǽ«Õ¹Ê¾²»Í¬µÄ´íÎó´¦Àí·½·¨£º

  • Òì³£µÄ»ù±¾Ê¹ÓÃ
  • ´´½¨×Ô¶¨ÒåµÄÒì³£´¦ÀíÆ÷
  • ¶à¸öÒì³£
  • ÖØÐÂÅ׳öÒì³£
  • ÉèÖö¥²ãÒì³£´¦ÀíÆ÷

Òì³£µÄ»ù±¾Ê¹ÓÃ

µ±Òì³£±»Å׳öʱ£¬ÆäºóµÄ´úÂë²»»á¼ÌÐøÖ´ÐУ¬PHP »á³¢ÊÔ²éÕÒÆ¥ÅäµÄ "catch" ´úÂë¿é¡£

Èç¹ûÒ쳣ûÓб»²¶»ñ£¬¶øÇÒÓÖûÓÃʹÓà set_exception_handler() ×÷ÏàÓ¦µÄ´¦ÀíµÄ»°£¬ÄÇô½«·¢ÉúÒ»¸öÑÏÖØµÄ´íÎó£¨ÖÂÃü´íÎ󣩣¬²¢ÇÒÊä³ö "Uncaught Exception" £¨Î´²¶»ñÒì³££©µÄ´íÎóÏûÏ¢¡£

ÈÃÎÒÃdz¢ÊÔÅ׳öÒ»¸öÒì³££¬Í¬Ê±²»È¥²¶»ñËü£º

<?php
//create function with an exception
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }

//trigger exception
checkNum(2);
?>

ÉÏÃæµÄ´úÂë»á»ñµÃÀàËÆÕâÑùµÄÒ»¸ö´íÎó£º

Fatal error: Uncaught exception 'Exception' 
with message 'Value must be 1 or below' in C:\webfolder\test.php:6 
Stack trace: #0 C:\webfolder\test.php(12): 
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Try, throw ºÍ catch

Òª±ÜÃâÉÏÃæÀý×Ó³öÏֵĴíÎó£¬ÎÒÃÇÐèÒª´´½¨Êʵ±µÄ´úÂëÀ´´¦ÀíÒì³£¡£

ÕýÈ·µÄ´¦Àí³ÌÐòÓ¦µ±°üÀ¨£º

  1. Try - ʹÓÃÒì³£µÄº¯ÊýÓ¦¸ÃλÓÚ "try" ´úÂë¿éÄÚ¡£Èç¹ûûÓд¥·¢Òì³££¬Ôò´úÂ뽫ÕÕ³£¼ÌÐøÖ´ÐС£µ«ÊÇÈç¹ûÒì³£±»´¥·¢£¬»áÅ׳öÒ»¸öÒì³£¡£
  2. Throw - ÕâÀï¹æ¶¨ÈçºÎ´¥·¢Òì³£¡£Ã¿Ò»¸ö "throw" ±ØÐë¶ÔÓ¦ÖÁÉÙÒ»¸ö "catch"
  3. Catch - "catch" ´úÂë¿é»á²¶»ñÒì³££¬²¢´´½¨Ò»¸ö°üº¬Òì³£ÐÅÏ¢µÄ¶ÔÏó

ÈÃÎÒÃÇ´¥·¢Ò»¸öÒì³££º

<?php
//´´½¨¿ÉÅ׳öÒ»¸öÒì³£µÄº¯Êý
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }

//ÔÚ "try" ´úÂë¿éÖд¥·¢Òì³£
try
 {
 checkNum(2);
 //If the exception is thrown, this text will not be shown
 echo 'If you see this, the number is 1 or below';
 }

//²¶»ñÒì³£
catch(Exception $e)
 {
 echo 'Message: ' .$e->getMessage();
 }
?>

ÉÏÃæ´úÂ뽫»ñµÃÀàËÆÕâÑùÒ»¸ö´íÎó£º

Message: Value must be 1 or below 

Àý×Ó½âÊÍ£º

ÉÏÃæµÄ´úÂëÅ׳öÁËÒ»¸öÒì³££¬²¢²¶»ñÁËËü£º

  1. ´´½¨ checkNum() º¯Êý¡£Ëü¼ì²âÊý×ÖÊÇ·ñ´óÓÚ 1¡£Èç¹ûÊÇ£¬ÔòÅ׳öÒ»¸öÒì³£¡£
  2. ÔÚ "try" ´úÂë¿éÖе÷Óà checkNum() º¯Êý¡£
  3. checkNum() º¯ÊýÖеÄÒì³£±»Å׳ö
  4. "catch" ´úÂë¿é½ÓÊÕµ½¸ÃÒì³££¬²¢´´½¨Ò»¸ö°üº¬Òì³£ÐÅÏ¢µÄ¶ÔÏó ($e)¡£
  5. ͨ¹ý´ÓÕâ¸ö exception ¶ÔÏóµ÷Óà $e->getMessage()£¬Êä³öÀ´×Ô¸ÃÒì³£µÄ´íÎóÏûÏ¢

²»¹ý£¬ÎªÁË×ñÑ­¡°Ã¿¸ö throw ±ØÐë¶ÔÓ¦Ò»¸ö catch¡±µÄÔ­Ôò£¬¿ÉÒÔÉèÖÃÒ»¸ö¶¥²ãµÄÒì³£´¦ÀíÆ÷À´´¦Àí©µôµÄ´íÎó¡£

´´½¨Ò»¸ö×Ô¶¨ÒåµÄ Exception Àà

´´½¨×Ô¶¨ÒåµÄÒì³£´¦Àí³ÌÐò·Ç³£¼òµ¥¡£ÎÒÃǼòµ¥µØ´´½¨ÁËÒ»¸öרÃŵÄÀ࣬µ± PHP Öз¢ÉúÒ쳣ʱ£¬¿Éµ÷ÓÃÆäº¯Êý¡£¸ÃÀà±ØÐëÊÇ exception ÀàµÄÒ»¸öÀ©Õ¹¡£

Õâ¸ö×Ô¶¨ÒåµÄ exception Àà¼Ì³ÐÁË PHP µÄ exception ÀàµÄËùÓÐÊôÐÔ£¬Äú¿ÉÏòÆäÌí¼Ó×Ô¶¨ÒåµÄº¯Êý¡£

ÎÒÃÇ¿ªÊ¼´´½¨ exception Àࣺ

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
  return $errorMsg;
  }
 }

$email = "someone@example...com";

try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //throw exception if email is not valid
  throw new customException($email);
  }
 }

catch (customException $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
?>

Õâ¸öеÄÀàÊÇ¾ÉµÄ exception ÀàµÄ¸±±¾£¬Íâ¼Ó errorMessage() º¯Êý¡£ÕýÒòΪËüÊǾÉÀàµÄ¸±±¾£¬Òò´ËËü´Ó¾ÉÀà¼Ì³ÐÁËÊôÐԺͷ½·¨£¬ÎÒÃÇ¿ÉÒÔʹÓà exception ÀàµÄ·½·¨£¬±ÈÈç getLine() ¡¢ getFile() ÒÔ¼° getMessage()¡£

Àý×Ó½âÊÍ£º

ÉÏÃæµÄ´úÂëÅ׳öÁËÒ»¸öÒì³££¬²¢Í¨¹ýÒ»¸ö×Ô¶¨ÒåµÄ exception ÀàÀ´²¶»ñËü£º

  1. customException() ÀàÊÇ×÷Ϊ¾ÉµÄ exception ÀàµÄÒ»¸öÀ©Õ¹À´´´½¨µÄ¡£ÕâÑùËü¾Í¼Ì³ÐÁ˾ÉÀàµÄËùÓÐÊôÐԺͷ½·¨¡£
  2. ´´½¨ errorMessage() º¯Êý¡£Èç¹û e-mail µØÖ·²»ºÏ·¨£¬Ôò¸Ãº¯Êý·µ»ØÒ»Ìõ´íÎóÏûÏ¢
  3. °Ñ $email ±äÁ¿ÉèÖÃΪ²»ºÏ·¨µÄ e-mail µØÖ·×Ö·û´®
  4. Ö´ÐÐ "try" ´úÂë¿é£¬ÓÉÓÚ e-mail µØÖ·²»ºÏ·¨£¬Òò´ËÅ׳öÒ»¸öÒì³£
  5. "catch" ´úÂë¿é²¶»ñÒì³££¬²¢ÏÔʾ´íÎóÏûÏ¢

¶à¸öÒì³£

¿ÉÒÔΪһ¶Î½Å±¾Ê¹Óöà¸öÒì³££¬À´¼ì²â¶àÖÖÇé¿ö¡£

¿ÉÒÔʹÓöà¸ö if..else ´úÂë¿é£¬»òÒ»¸ö switch ´úÂë¿é£¬»òÕßǶÌ×¶à¸öÒì³£¡£ÕâЩÒì³£Äܹ»Ê¹Óò»Í¬µÄ exception À࣬²¢·µ»Ø²»Í¬µÄ´íÎóÏûÏ¢£º

<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}

$email = "someone@example.com";

try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //throw exception if email is not valid
  throw new customException($email);
  }
 //check for "example" in mail address
 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();
 }
?>

Àý×Ó½âÊÍ£º

ÉÏÃæµÄ´úÂë²âÊÔÁËÁ½ÖÖÌõ¼þ£¬ÈçºÎÈκÎÌõ¼þ²»³ÉÁ¢£¬ÔòÅ׳öÒ»¸öÒì³££º

  1. customException() ÀàÊÇ×÷Ϊ¾ÉµÄ exception ÀàµÄÒ»¸öÀ©Õ¹À´´´½¨µÄ¡£ÕâÑùËü¾Í¼Ì³ÐÁ˾ÉÀàµÄËùÓÐÊôÐԺͷ½·¨¡£
  2. ´´½¨ errorMessage() º¯Êý¡£Èç¹û e-mail µØÖ·²»ºÏ·¨£¬Ôò¸Ãº¯Êý·µ»ØÒ»¸ö´íÎóÏûÏ¢¡£
  3. Ö´ÐÐ "try" ´úÂë¿é£¬ÔÚµÚÒ»¸öÌõ¼þÏ£¬²»»áÅ׳öÒì³£¡£
  4. ÓÉÓÚ e-mail º¬ÓÐ×Ö·û´® "example"£¬µÚ¶þ¸öÌõ¼þ»á´¥·¢Òì³£¡£
  5. "catch" ´úÂë¿é»á²¶»ñÒì³££¬²¢ÏÔʾǡµ±µÄ´íÎóÏûÏ¢

Èç¹ûûÓв¶»ñ customException£¬½ô½ô²¶»ñÁË base exception£¬ÔòÔÚÄÇÀï´¦ÀíÒì³£¡£

ÖØÐÂÅ׳öÒì³£

ÓÐʱ£¬µ±Òì³£±»Å׳öʱ£¬ÄúÒ²ÐíÏ£ÍûÒÔ²»Í¬ÓÚ±ê×¼µÄ·½Ê½¶ÔËü½øÐд¦Àí¡£¿ÉÒÔÔÚÒ»¸ö "catch" ´úÂë¿éÖÐÔÙ´ÎÅ׳öÒì³£¡£

½Å±¾Ó¦¸Ã¶ÔÓû§Òþ²ØÏµÍ³´íÎó¡£¶Ô³ÌÐòÔ±À´Ëµ£¬ÏµÍ³´íÎóÒ²ÐíºÜÖØÒª£¬µ«ÊÇÓû§¶ÔËüÃDz¢²»¸ÐÐËȤ¡£ÎªÁËÈÃÓû§¸üÈÝÒ×ʹÓã¬Äú¿ÉÒÔÔÙ´ÎÅ׳ö´øÓжÔÓû§±È½ÏÓѺõÄÏûÏ¢µÄÒì³££º

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
  return $errorMsg;
  }
 }

$email = "someone@example.com";

try
 {
 try
  {
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE)
   {
   //throw exception if email is not valid
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  //re-throw exception
  throw new customException($email);
  }
 }

catch (customException $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
?>

Àý×Ó½âÊÍ£º

ÉÏÃæµÄ´úÂë¼ì²âÔÚÓʼþµØÖ·ÖÐÊÇ·ñº¬ÓÐ×Ö·û´® "example"¡£Èç¹ûÓУ¬ÔòÔÙ´ÎÅ׳öÒì³££º

  1. customException() ÀàÊÇ×÷Ϊ¾ÉµÄ exception ÀàµÄÒ»¸öÀ©Õ¹À´´´½¨µÄ¡£ÕâÑùËü¾Í¼Ì³ÐÁ˾ÉÀàµÄËùÓÐÊôÐԺͷ½·¨¡£
  2. ´´½¨ errorMessage() º¯Êý¡£Èç¹û e-mail µØÖ·²»ºÏ·¨£¬Ôò¸Ãº¯Êý·µ»ØÒ»¸ö´íÎóÏûÏ¢¡£
  3. °Ñ $email ±äÁ¿ÉèÖÃΪһ¸öÓÐЧµÄÓʼþµØÖ·£¬µ«º¬ÓÐ×Ö·û´® "example"¡£
  4. "try" ´úÂë¿é°üº¬ÁíÒ»¸ö "try" ´úÂë¿é£¬ÕâÑù¾Í¿ÉÒÔÔÙ´ÎÅ׳öÒì³£¡£
  5. ÓÉÓÚ e-mail °üº¬×Ö·û´® "example"£¬Òò´Ë´¥·¢Òì³£¡£
  6. "catch" ²¶»ñµ½¸ÃÒì³££¬²¢ÖØÐÂÅ׳ö "customException"¡£
  7. ²¶»ñµ½ "customException"£¬²¢ÏÔʾһÌõ´íÎóÏûÏ¢¡£

Èç¹ûÔÚÆäĿǰµÄ "try" ´úÂë¿éÖÐÒ쳣ûÓб»²¶»ñ£¬ÔòËü½«ÔÚ¸ü¸ß²ã¼¶ÉϲéÕÒ catch ´úÂë¿é¡£

ÉèÖö¥²ãÒì³£´¦ÀíÆ÷ £¨Top Level Exception Handler£©

set_exception_handler() º¯Êý¿ÉÉèÖô¦ÀíËùÓÐδ²¶»ñÒì³£µÄÓû§¶¨Ò庯Êý¡£

<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

ÒÔÉÏ´úÂëµÄÊä³öÓ¦¸ÃÀàËÆÕâÑù£º

Exception: Uncaught Exception occurred

ÔÚÉÏÃæµÄ´úÂëÖУ¬²»´æÔÚ "catch" ´úÂë¿é£¬¶øÊÇ´¥·¢¶¥²ãµÄÒì³£´¦Àí³ÌÐò¡£Ó¦¸ÃʹÓô˺¯ÊýÀ´²¶»ñËùÓÐδ±»²¶»ñµÄÒì³£¡£

Òì³£µÄ¹æÔò

  • ÐèÒª½øÐÐÒì³£´¦ÀíµÄ´úÂëÓ¦¸Ã·ÅÈë try ´úÂë¿éÄÚ£¬ÒԱ㲶»ñDZÔÚµÄÒì³£¡£
  • ÿ¸ö try »ò throw ´úÂë¿é±ØÐëÖÁÉÙÓµÓÐÒ»¸ö¶ÔÓ¦µÄ catch ´úÂë¿é¡£
  • ʹÓöà¸ö catch ´úÂë¿é¿ÉÒÔ²¶»ñ²»Í¬ÖÖÀàµÄÒì³£¡£
  • ¿ÉÒÔÔÚ try ´úÂë¿éÄÚµÄ catch ´úÂë¿éÖÐÔÙ´ÎÅ׳ö£¨re-thrown£©Òì³£¡£

¼ò¶øÑÔÖ®£ºÈç¹ûÅ׳öÁËÒì³££¬¾Í±ØÐë²¶»ñËü¡£

VUE