首页 > 后端开发 > php教程 > 异常处理try-catch-finally_PHP教程

异常处理try-catch-finally_PHP教程

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-07-13 10:29:45
原创
1076 人浏览过

php5.5新增 Finally模块

try {
    //好好干,出了问题不要怕,外面有人接应
} catch (HttpException $e) {
    //时刻准备着,处理上面抛出的HTTP问题
} catch (Exception $e) {
    //时刻准备着,处理他们都处理不了的问题
} finally {
    //打扫战场,都收拾好了再走人
}


try 中 return 后 finally 会继续执行,如果 finally 中也有return,则最终返回值为 finally 中 return 的值。
try 中 die 或 exit 后 finally 不会执行。

example01:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<?<span>php

</span><span>/*</span><span>*

finally块是个很好的设计,其中的return语句能覆盖其他块中的return语句,并处理try catch抛出的异常

无需try-catch嵌套来处理子try-catch抛出的异常

这个跟java的一样,c#是在finally块中存在return语句会抛出compile time error(编译时错误)

</span><span>*/</span>

 

<span>function</span><span> asdf()

{

    </span><span>try</span><span> {

        </span><span>throw</span> <span>new</span> <span>Exception</span>('error'<span>);

    }

    </span><span>catch</span>(<span>Exception</span> <span>$e</span><span>) {

        </span><span>echo</span> "An error occurred"<span>;

        </span><span>throw</span> <span>$e</span><span>;

    }

    finally {

                </span><span>//</span><span>This overrides the exception as if it were never thrown</span>

        <span>return</span> "\nException erased"<span>;

    }

}

 

</span><span>try</span><span> {

    </span><span>echo</span><span> asdf();

}

</span><span>catch</span>(<span>Exception</span> <span>$e</span><span>) {

    </span><span>echo</span> "\nResult: " . <span>$e</span>-><span>getMessage();

}

 

</span><span>/*</span><span>

 The output from above will look like this:

 

     An error occurred

     Exception erased

 

 Without the return statement in the finally block it would look like this:

 

     An error occurred

     Result: error

</span><span>*/</span>

登录后复制


example02:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?<span>php

</span><span>/*</span><span>*

有个相悖的行为在PHP 5.5.3's finally 和 return statements:

在一个方法中,try块单返回一个变量,finally块修改这个变量,返回的是finally修改过的,

但当try块返回的变量参与运算(evaluated in-line),会忽略finally块对这个变量的修改

(不知道原因...)

</span><span>*/</span>

<span>function</span><span> returnVariable(){

 </span><span>$foo</span> = 1<span>;

 </span><span>try</span><span>{

 </span><span>return</span> <span>$foo</span><span>;

 } finally {

 </span><span>$foo</span>++<span>;

 }

 }

 

 </span><span>function</span><span> returnVariablePlusZero(){

 </span><span>$foo</span> = 1<span>;

 </span><span>try</span><span>{

 </span><span>return</span> <span>$foo</span>+0<span>;

 } finally {

 </span><span>$foo</span>++<span>;

 }

 }

 

 </span><span>$test1</span> = returnVariable(); <span>//</span><span> returns 2, not the correct value of 1.</span>

 <span>$test2</span> = returnVariablePlusZero(); <span>//</span><span> returns correct value of 1, but inconsistent with $test1.</span>

登录后复制


example03:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<?<span>php

</span><span>/*</span><span>*

小例子 验证变量

check if the name contains only letters, and does not contain the word name

</span><span>*/</span>

 

<span>$name</span> = "Name"<span>;

</span><span>try</span><span>

{

        </span><span>try</span><span>

        {

                </span><span>//</span><span>preg_match() 返回 pattern  的匹配次数。 它的值将是0次(不匹配)或1次,因为 preg_match() 在第一次匹配后 将会停止搜索。 preg_match_all() 不同于此,它会一直搜索 subject  直到到达结尾。 如果发生错误 preg_match() 返回 FALSE 。</span>

                <span>if</span>(<span>preg_match</span>('/[^a-z]/i', <span>$name</span><span>))

                {

                        </span><span>throw</span> <span>new</span> <span>Exception</span>("<span>$name</span> contains character other than a-z A-Z"<span>);

                }

                </span><span>if</span>(<span>strpos</span>(<span>strtolower</span>(<span>$name</span>), 'name') !== <span>false</span><span>)

                {

                        </span><span>throw</span> <span>new</span> <span>Exception</span>("<span>$name</span> contains the word name"<span>);

                }

                </span><span>echo</span> "The Name is valid"<span>;

        }

        </span><span>catch</span> (<span>exception</span> <span>$e</span><span>)

        {

                </span><span>throw</span> <span>new</span> <span>Exception</span>("insert name again", 0, <span>$e</span><span>);

        }

}

 

</span><span>catch</span> (<span>exception</span> <span>$e</span><span>)

{

        </span><span>if</span>(<span>$e</span>-><span>getPrevious())

        {

                </span><span>echo</span> "The Previous Exception is: " . <span>$e</span>->getPrevious()->getMessage() . "<br/>"<span>;

        }

        </span><span>echo</span> "The Exception is: " . <span>$e</span>->getMessage() . "<br/>"<span>;

}</span>

登录后复制


example04

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?<span>php

</span><span>/*</span><span>

When catching an exception inside a namespace it is important that you escape to the global space:

如何逃离出命名空间

</span><span>*/</span><span>

 

 namespace SomeNamespace;

 

 </span><span>class</span><span> SomeClass {

 

  </span><span>function</span><span> SomeFunction() {

   </span><span>try</span><span> {

    </span><span>throw</span> <span>new</span> <span>Exception</span>('Some Error Message'<span>);

   } </span><span>catch</span> (\<span>Exception</span> <span>$e</span><span>) {

    </span><span>var_dump</span>(<span>$e</span>-><span>getMessage());

   }

  }

 

 }

 

</span><span>//</span><span>报错:

//Fatal error: Class 'SomeNamespace\Exception' not found in C:\xampp\htdocs\tonglei\index.php on line 8</span>

登录后复制


example05

1

2

3

4

5

6

7

8

9

10

11

<?<span>php

 

</span><span>//</span><span>下面的写法会报T_THROW Syntax Error.</span>

someFunction() OR <span>throw</span> <span>new</span> <span>Exception</span><span>();

 

</span><span>//</span><span>这种写法可以用下面这个正确的形式</span>

<span>function</span> throwException(<span>$message</span> = <span>null</span>,<span>$code</span> = <span>null</span><span>) {

    </span><span>throw</span> <span>new</span> <span>Exception</span>(<span>$message</span>,<span>$code</span><span>);

}

 

someFunction() OR throwException();<br /><br /></span>

登录后复制

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/769758.htmlTechArticlephp5.5新增 Finally模块 try { //好好干,出了问题不要怕,外面有人接应 } catch (HttpException $e) { //时刻准备着,处理上面抛出的HTTP问题 } catch (...
相关标签:
php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
怎么学好php
来自于 1970-01-01 08:00:00
0
0
0
PHP扩展intl
来自于 1970-01-01 08:00:00
0
0
0
php数据获取?
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板