PHP异常与处理

1.什么是异常

  异常指的是程序运行中发生的一些我们不希望发生的事情。程序发生错误,这显然是我们不希望发生的事情,所以异常包括的范围实际上要比错误更广泛一些。

  比如函数得到了一个我们意料之外的参数,这就是一个异常,而非错误。

2.异常处理

 1 <?php
 2     class myday
 3     {
 4         public function getup($f=1)
 5         {
 6             if($f)
 7             {
 8                 echo "正常起床<br>";
 9             }
10             else
11             {
12                 echo "我起不来<br>";
13                 echo "打电话请假吧";
14             }
15         }
16         public function gotowork($f=1)
17         {
18             if($f==1)
19             {
20                 echo "步行去上班<br>";
21             }
22             elseif ($f==2) 
23             {
24                 echo "坐地铁去上班<br>";
25             }
26             elseif ($f==3) 
27             {
28                 echo "做出租去上班<br>";
29             }
30             else
31             {
32                 echo "我不知道怎么去上班<br>";
33                 echo "打电话请假";
34             }
35         }
36         public function work($f=1)
37         {
38             if($f)
39             {
40                 echo "到达公司,开始工作<br>";
41             }
42             else
43             {
44                 echo "没能到达公司<br>";
45                 echo "打电话请假吧";
46             }
47         }
48     };
49     $p=new myday();
50     $p->getup();
51     $p->gotowork();
52     $p->work();
53 ?>

 

   看上面代码,没有什么值得注意的对吧。其实这段代码中已经有了异常处理的思想了。每一个esle从句,实际上都是一个异常处理,用于处理一个我们不希望得到的参数。

  但是这样做是不够好的,如果我们希望将异常的处理从函数体类分离出来,应该这样做

 1 <?php
 2     class myday
 3     {
 4         public function getup($f=1)
 5         {
 6             if($f)
 7             {
 8                 echo "正常起床<br>";
 9             }
10             else
11             {
12                 throw new Exception("没能正常起床", 1);
13                 
14             }
15         }
16         public function gotowork($f=1)
17         {
18             if($f==1)
19             {
20                 echo "步行去上班<br>";
21             }
22             elseif ($f==2) 
23             {
24                 echo "坐地铁去上班<br>";
25             }
26             elseif ($f==3) 
27             {
28                 echo "做出租去上班<br>";
29             }
30             else
31             {
32                 throw new Exception("不知道怎么去上班", 1);
33             }
34         }
35         public function work($f=1)
36         {
37             if($f)
38             {
39                 echo "到达公司,开始工作<br>";
40             }
41             else
42             {
43                 throw new Exception("没到达公司", 1);
44             }
45         }
46     };
47     $p=new myday();
48     try
49     {
50         $p->getup();
51         $p->gotowork(0);
52         $p->work();
53     }
54     catch(Exception $e)
55     {    
56         echo $e->getMessage();
57         echo "打电话请假";
58     }
59 
60     
61 ?>

 

  这样一来,只需要在函数体中做一个异常的判断,而异常的处理就可以在函数体之外进行了。

  但是上面,对于发生的异常我们都有同样的处理方法,就是“打电话请假”,那么如果对于不同的异常有不同的处理该怎么办呢?

  是的,你应该想到了,多些几个try{}catch{}从句就可以了

 1     try
 2     {
 3         $p->getup();
 4     }
 5     catch(Exception $e)
 6     {    
 7         echo $e->getMessage();
 8         echo "不能起床,解决办法";
 9     }
10     try
11     {
12         $p->gotowork();
13     }
14     catch(Exception $e)
15     {    
16         echo $e->getMessage();
17         echo "不知道坐车,解决办法";
18     }
19 
20     try
21     {        
22         $p->gotowork(0);
23     }
24     catch(Exception $e)
25     {    
26         echo $e->getMessage();
27         echo "没能到公司,解决办法";
28     }

   但是这并不是很好的方法,更符合逻辑的方法是,对于不同的异常抛出不同的异常对象

<?php
    class getupex extends Exception
    {
        
        public function solve()
        {
            echo "不能起床,解决一下";
        }
    }
    class gotowex extends Exception
    {
        
        public function solve()
        {
            echo "不知道怎么坐车,解决一下";
        }
    }
    class workex extends Exception
    {
        
        public function solve()
        {
            echo "没到公司,解决一下";
        }
    }

    /************************************************/

    class myday
    {
        public function getup($f=1)
        {
            if($f)
            {
                echo "正常起床<br>";
            }
            else
            {
                throw new getupex("没能正常起床", 1);
                
            }
        }
        public function gotowork($f=1)
        {
            if($f==1)
            {
                echo "步行去上班<br>";
            }
            elseif ($f==2) 
            {
                echo "坐地铁去上班<br>";
            }
            elseif ($f==3) 
            {
                echo "做出租去上班<br>";
            }
            else
            {
                throw new gotowex("不知道怎么去上班", 1);
            }
        }
        public function work($f=1)
        {
            if($f)
            {
                echo "到达公司,开始工作<br>";
            }
            else
            {
                throw new workex("没到达公司", 1);
            }
        }
    };
    $p=new myday();
    try
    {
        $p->getup();
        $p->gotowork();
        $p->work();
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
        echo $e->solve();
    }
?>

     这样一来就非常好了

  如果遇到更加离谱的异常,比如调用函数时不按规定传入了多个参数呢。对于这个实际上已经达到了错误的级别了。这时PHP会向页面或日志输出错误报告。

  但是有些这种错误是我们可以处理的了,我们希望发生这种错误时一并交给错误处理函数来处理。这应该怎么做呢,该怎么在合适的时候抛出异常呢

1     set_error_handler('error_hand');
2     function error_hand($level,$message,$file,$line)
3     {
4         if($line==82) throw new getupex("没能正常起床", 1);
5         elseif ($line==83) throw new gotowex("不知道怎么去上班", 1);
6         elseif ($line==84) throw new workex("没到达公司", 1);
7     }

   这里用到了错误处理函数,这样一来就可以在发生错误时,自动抛出异常交给异常处理函数去处理了,其中$line用来判断错误发生的行数。

posted @ 2018-01-11 15:46  帕特菛琦  阅读(114)  评论(0编辑  收藏  举报