>  기사  >  백엔드 개발  >  php_php 기술의 예외 처리 방법 요약

php_php 기술의 예외 처리 방법 요약

WBOY
WBOY원래의
2016-05-16 20:25:561133검색

이 기사의 예에는 PHP의 예외 처리 방법이 요약되어 있습니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

예외가 발생하면 일반적으로 발생합니다. PHP5에는 다른 언어와 유사한 오류 예외 처리 모듈이 추가되었습니다. PHP 코드에서 생성된 예외는 throw 문에 의해 발생되고 catch 문에 의해 포착될 수 있습니다. 예외 처리가 필요한 코드는 가능한 예외를 포착하기 위해 try 코드 블록에 배치되어야 합니다. 모든 시도에는 해당하는 캐치가 하나 이상 있어야 합니다.

다양한 캐치를 사용하여 다른 클래스에서 생성된 예외를 포착합니다. try 코드 블록이 더 이상 예외를 발생시키지 않거나 던져진 예외와 일치하는 캐치를 찾을 수 없으면 PHP 코드는 캐치 후 마지막 항목으로 점프합니다. 물론, PHP는 catch 코드 블록 내에서 예외가 다시 발생하도록 허용합니다. 예외가 발생하면 후속 코드(번역자 참고 사항: 예외가 발생한 코드 블록을 나타냄)는 계속해서 실행을 시도하지 않습니다. 첫 번째로 일치하는 catch를 찾습니다. 예외가 포착되지 않고 해당 처리에 set_Exception_handler()를 사용할 필요가 없으면 PHP는 심각한 오류를 생성하고 Uncaught Exception ...(잡히지 않은 예외) 프롬프트 정보를 출력합니다.

1. 예외 클래스의 계층 관계는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
class NotFoundException은 Exception을 확장합니다.{}

InputException 클래스가 Exception을 확장함{}

클래스 DBException은 예외를 확장합니다.{}

2. 포착되지 않은 예외에 대한 핸들러를 구성합니다. 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
function 예외_uncaught_handler(Exception $e) { 
header('Content-type:text/html; charset=utf-8')
if ($e 인스턴스of NotFoundException)
종료($e->getMessage())
elseif($e DBException 인스턴스)
종료($e->getMessage())
그렇지 않으면
종료($e->getMessage())

set_Exception_handler('Exception_uncaught_handler');

3. 데이터베이스 연결 코드에서 DBException을 수동으로 발생시켰지만 이를 잡기 위해 try...catch를 사용하지 않은 경우 해당 예외는 PHP 사용자 정의 예외 처리기인 예외_uncaught_handler() 함수에 의해 처리됩니다.
코드 복사 코드는 다음과 같습니다.
$this->resConn = mysql_connect ($CONFIGS['db_host' ], $ CONFIGS['db_user'], $CONFIGS['db_pwd'])
if (false == is_resource($this->resConn))
throw new DBException('데이터베이스 연결에 실패했습니다.'.mysql_error($this->resConn));

4. 비즈니스 로직 개요:
코드 복사 코드는 다음과 같습니다.
if (0 != strcmp($curAlbum->interest_id, $ 그것))

새 NotFoundException 발생('죄송합니다. 방문한 앨범이 존재하지 않습니다.');

위는 PHP 사용자 정의 예외 처리기를 사용하는 구체적인 방법입니다.

php 예제 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
클래스 customException은 예외를 확장합니다
{
공개 함수 errorMessage()
{
//오류 메시지
$errorMsg = ''.$this->getLine() 줄에 오류가 있습니다.' '.$this->getFile()
.': '.$this->getMessage().' 유효한 이메일 주소가 아닙니다';
$errorMsg를 반환합니다.
}
}
 
$email = "someone@example.com";
 
시도해 보세요
 {
 //다음인지 확인하세요.
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //이메일이 유효하지 않으면 예외 발생
  새로운 customException($email)을 던져라;
  }
 //메일 주소에서 "예제"를 확인하세요
 if(strpos($email, "예제") !== FALSE)
  {
  throw new Exception("$email은 이메일의 예입니다.");
  }
 }
 
잡기(customException $e)
 {
 echo $e->errorMessage();
 }
 
catch(예외 $e)
 {
 echo $e->getMessage();
 }
?>

例子 解释:상면적 代码测试了两种条件,如何任何条件不成立,则抛出一个异常.

1.customException()은 예외를 발생시키는 데 사용되는 모든 예외를 확장하는 데 사용됩니다.

2.创建 errorMessage() 函数,如果 이메일 地址不합법,则该函数返回一个错误消息.

3.执行 "시도" 代码块,지금 第一个条件下,不会抛流异常.

4.由于 이메일 含有字符串 "예",第二个条件会触发异常.

5."잡다" 代码块会捕获异常,并显示恰当的错误消息.

如果没有捕获 customException, 紧紧捕获了 기본 예외, 则紧捕获了 기본 예외, 则在那里处理异常, 重新抛take异常,有时,当异常被抛以时,您也许希望以于标准的方式对它进行处理,可以在一个 "catch" 代码块中再次抛流异常,代码如下:

总结:PHP异常적 사용 방법 분리:

第二步:当流异常时用 throw 抛流异常,例如 ex1($num2);异常的参数是$num2用该异常的getMessage()获取;

第三步:触发异常,用try子句,当满足条件时  throw new ex1($num);

第4步:catch捕获异常 catch (ex2 $e), 同当于实例化一个determin义好的异常类ex2为$e;

注意,异常可以定义多个,但是只能触发一个,也就是说只能用catch捕获一个异常.

基本异常类,创建可抛出一个异常的函数:


复代码 代码如下:
함수 num($num){
if ($num>1){//예외 발생 조건
$msg="값은 1보다 클 수 없습니다.";//예외 메시지
새로운 예외 발생($msg);//예외 발생
}
echo "1보다 작은 수"; }
//"try" 코드 블록에서 예외 발생
{
을 시도해 보세요. 숫자(3); echo "정상적으로 실행되었습니다."
}
//예외 잡기
잡기(예외 $e){
echo "오류 메시지:".$e->getMessage();//Exception() 예외 정보를 얻기 위한 시스템 메소드
echo "오류 파일:".$e->getFile();//Exception()의 시스템 메소드가 예외 파일 이름을 가져옵니다
echo "라인 수:".$e->getLine();//Exception()의 시스템 메소드는 예외 라인 수를 가져옵니다
}
//================================================ ======================
에코 "
========================================== ============
";
//기본 예외 클래스 확장
function checkEmail($email){//EMAIL의 유효성을 확인하기 위해 예외를 발생시킬 수 있는 함수 정의
if (filter_var($email,FILTER_VALIDATE_EMAIL)==false){
새로운 checkEmailException($email)을 발생시킵니다.//예외를 발생시키고 EMAIL을 매개변수로 사용합니다
}
echo "이메일은 합법적입니다."; }
class checkEmailException은 예외를 확장합니다.{//확장 예외 클래스 정의
공개 함수 errormsg(){
$msg="오류 이유: ".$this->getMessage()."는 합법적인 이메일 주소가 아닙니다!"; $msg.="파일 이름 오류:".$this->getFile()
$msg.="줄 번호 오류:".$this->getLine()
에코 $msg; }
}
$email="이메일…..@chhua.com"
try {//예외 트리거
checkEmail($이메일)
}
//예외 잡기
catch(checkEmailException $e){
$e->errormsg()
}
//================================== 여러 예외 캡처
에코 "
========================================== =======
";
class ex1 extends Exception{//예외 클래스 정의
공개 함수 msg(){
$msg="오류 이유: ".$this->getMessage()."가 100보다 큼"
$msg.="오류 파일:".$this->getFile()."
"
$msg.="오류 코드:".$this->getCode()."
"
$msg.="줄 수:".$this->getLine()."
"
에코 $msg; }
}
class ex2 extends Exception{//예외 클래스 정의
         공개 함수 msg(){
$msg="오류 이유: ".$this->getMessage()."는 100과 같습니다."
$msg.="오류 파일:".$this->getFile()."
"
$msg.="줄 수:".$this->getLine()."
"
에코 $msg; }
}
$num2=100; {
을 시도해 보세요. if ($num2>100){//조건이 충족되면 트리거
새로운 ex1($num2) 던지기
}
if ($num2==100){//조건이 충족되면 트리거됨
새로운 ex2($num2) 던지기
}
}
catch (ex2 $e){//트리거된 예외 잡기
$e->msg()
}
catch (ex1 $e){//트리거된 예외 잡기
$e->msg()
}


이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.