php异常通知

在编写PHP代码时,我们经常会遇到各种各样的异常,例如访问未定义的变量、调用不存在的方法、连接数据库失败等等。这些异常会导致程序崩溃或产生意料之外的行为。为了处理这些异常,PHP提供了异常机制,可以捕获并处理异常,保证程序运行的稳定和可靠。本文将介绍PHP异常通知以及一些你可能不知道的函数。

一、PHP异常机制

1.1 什么是异常

异常是指程序执行期间出现的非正常情况,例如试图访问不存在的变量或方法、文件读写异常、网络连接异常等等。通常情况下,这些异常会导致程序崩溃或者产生意料之外的结果。为了避免这些情况,我们需要在代码中进行异常处理。

在PHP中,异常是一个类,它继承于Exception类,一般情况下我们需要自定义异常类。以下是创建customException类的示例:

```php

class customException extends Exception {

public function errorMessage() {

// 错误信息

$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()

.': '.$this->getMessage().' 不是一个合法的 E-Mail 地址';

return $errorMsg;

}

}

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

try {

// 检测email地址

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

// 如果是个不合法的邮箱地址,抛出异常

throw new customException($email);

}

}

catch (customException $e) {

// 捕获自定义异常

echo $e->errorMessage();

}

```

在上面的代码示例中,我们创建了一个customException类,用于处理E-Mail地址验证失败的情况。在try块中,我们调用了PHP内置的filter_var函数,如果验证失败,则抛出自定义异常。最后,在catch块中,我们捕获了自定义异常,输出了错误信息。

1.2 抛出异常

在PHP中,抛出异常是通过throw语句实现的。当程序在try块内部遇到异常情况时,可以使用throw语句抛出一个异常。下面是一个抛出自定义异常的示例:

```php

class customException extends Exception {

public function errorMessage() {

// 错误信息

$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()

.': '.$this->getMessage().' 不是一个合法的 E-Mail 地址';

return $errorMsg;

}

}

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

try {

// 检测email地址

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

// 如果是个不合法的邮箱地址,抛出异常

throw new customException($email);

}

}

catch (customException $e) {

// 捕获自定义异常

echo $e->errorMessage();

}

```

在上面的示例中,我们首先定义了一个customException类,用于处理E-Mail地址验证失败的情况。在try块中,我们调用了PHP内置的filter_var函数,如果验证失败,则抛出自定义异常。

1.3 捕获异常

在PHP中,捕获异常是通过try和catch语句实现的。try块内部包含可能抛出异常的代码,如果发生异常,则会抛出一个异常对象。在catch块内部,可以捕获这个异常对象,并进行相应的处理。

下面是一个捕获自定义异常的示例:

```php

class customException extends Exception {

public function errorMessage() {

// 错误信息

$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()

.': '.$this->getMessage().' 不是一个合法的 E-Mail 地址';

return $errorMsg;

}

}

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

try {

// 检测email地址

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

// 如果是个不合法的邮箱地址,抛出异常

throw new customException($email);

}

}

catch (customException $e) {

// 捕获自定义异常

echo $e->errorMessage();

}

```

在上面的示例中,我们首先定义了一个customException类,用于处理E-Mail地址验证失败的情况。在try块中,我们调用了PHP内置的filter_var函数,如果验证失败,则抛出自定义异常。在catch块中,我们捕获了自定义异常,并输出了错误信息。

1.4 多重catch块

在PHP中,可以使用多个catch块来捕获不同类型的异常。如果在try块中抛出一个异常,系统会检查catch块的类型是否与这个异常类型相同,如果相同,则使用这个catch块来捕获这个异常。

下面是一个使用多个catch块的示例:

```php

try {

$file = 'test.txt';

$handle = fopen($file, 'r');

if (!$handle) {

throw new Exception("文件打开失败!");

}

$contents = fread($handle, filesize($file));

fclose($handle);

if (!$contents) {

throw new Exception("文件读取失败!");

}

}

catch (Exception $e) {

echo "抛出异常:" . $e->getMessage();

}

catch (AnotherException $e) {

echo "抛出另一个异常:" . $e->getMessage();

}

```

在上面的示例中,我们首先尝试打开一个不存在的文件test.txt,如果打开失败,则抛出一个类型为Exception的异常,系统的异常机制会尝试使用catch块来捕获这个异常。因为catch块的类型为Exception,所以可以捕获任何类型的异常。如果系统在try块中抛出另外一种类型的异常,则需要使用另外一个catch块来捕获它。

1.5 finally块

在PHP中,可以使用finally块来包含一段代码,这段代码总是会在try块中的代码执行完毕后执行,无论try块中是否抛出异常。通常情况下,finally块中的代码用于清理资源,例如关闭数据连接、删除临时文件等等。

下面是一个使用finally块的示例:

```php

try {

$file = 'test.txt';

$handle = fopen($file, 'r');

if (!$handle) {

throw new Exception("文件打开失败!");

}

$contents = fread($handle, filesize($file));

fclose($handle);

if (!$contents) {

throw new Exception("文件读取失败!");

}

}

catch (Exception $e) {

echo "抛出异常:" . $e->getMessage();

}

finally {

echo "清理资源";

}

```

在上面的示例中,finally块里面的代码总是会被执行。无论try块是否抛出异常,资源清理的代码都会被执行。

二、PHP异常通知

2.1 set_exception_handler()

PHP提供了set_exception_handler()函数,用于设置全局异常处理函数。在程序中抛出任何异常时,都会调用这个函数进行处理。下面是一个使用set_exception_handler()函数的示例:

```php

function exception_handler($exception) {

echo "Uncaught exception: " , $exception->getMessage(), "\n";

}

set_exception_handler('exception_handler');

throw new Exception('异常测试!');

```

在上面的示例中,我们首先使用set_exception_handler()函数设置了一个全局异常处理函数exception_handler。在try块中,我们抛出了一个类型为Exception的异常。当系统在try块中抛出这个异常时,会调用全局异常处理函数exception_handler进行处理,输出错误信息。

2.2 error_reporting()

PHP提供了error_reporting()函数,用于设置错误报告级别。在某些情况下,可能需要开启或关闭某些错误信息的输出。下面是一个使用error_reporting()函数的示例:

```php

// 显示除 E_NOTICE 之外的所有错误

error_reporting(E_ALL & ~E_NOTICE);

// 关闭所有错误

error_reporting(0);

```

在上面的示例中,我们首先使用error_reporting()函数设置了一个错误报告级别,只显示除E_NOTICE之外的所有错误。在第二个示例中,我们关闭了所有错误输出。

2.3 restore_exception_handler()

PHP提供了restore_exception_handler()函数,用于将全局异常处理函数恢复为默认值。如果我们想要在程序的某个区域使用不同的异常处理函数,需要在结束时将全局处理函数恢复为默认值。下面是一个使用restore_exception_handler()函数的示例:

```php

function custom_exception_handler($exception) {

echo "Uncaught exception: " , $exception->getMessage(), "\n";

}

set_exception_handler('custom_exception_handler');

throw new Exception('异常测试!');

restore_exception_handler();

throw new Exception('异常测试2!');

```

在上面的示例中,我们首先使用set_exception_handler()函数设置了一个全局的异常处理函数custom_exception_handler。在try块中,我们抛出了一个类型为Exception的异常,触发了异常处理函数的执行。然后,我们使用restore_exception_handler()函数将全局异常处理函数恢复为默认值。在try块之外,我们又抛出了一个类型为Exception的异常,此时会使用默认的全局异常处理函数进行处理。

三、PHP你不知道的函数

3.1 debug_backtrace()

PHP提供了debug_backtrace()函数,用于输出当前程序的调用堆栈信息。在某些情况下,我们需要了解程序的执行路径和调用关系,这时可以使用debug_backtrace()函数来获取调用堆栈信息。

下面是一个使用debug_backtrace()函数的示例:

```php

function func1() {

func2();

}

function func2() {

func3();

}

function func3() {

var_dump(debug_backtrace());

}

func1();

```

在上面的示例中,我们定义了三个函数func1、func2和func3,分别调用了下一个函数。在最后一个函数func3中,我们使用debug_backtrace()函数输出了调用堆栈信息。输出结果中包含了程序调用的路径和各个函数的参数值。

3.2 get_included_files()

PHP提供了get_included_files()函数,用于获取当前程序执行过程中已经包含的文件列表。在一些复杂的程序中,可能涉及到多个文件的包含和引用,这时我们可以使用get_included_files()函数来获取这些文件的列表。

下面是一个使用get_included_files()函数的示例:

```php

// 引入test.php文件

include_once 'test.php';

// 显示已经加载的文件列表

var_dump(get_included_files());

```

在上面的示例中,我们使用include_once语句加载了test.php文件,并使用var_dump()函数输出了已经加载的文件列表。输出结果中包含了我们刚刚加载的test.php文件的路径。

3.3 get_class()

PHP提供了get_class()函数,用于获取对象所属的类名。在程序中,可能需要获取对象所属的类名,这时可以使用get_class()函数。

下面是一个使用get_class()函数的示例:

```php

class myClass {

function myFunction() {

echo get_class($this);

}

}

$myObj = new myClass;

$myObj->myFunction();

```

在上面的示例中,我们定义了一个类myClass,并在这个类中定义了一个方法myFunction。在这个方法中,我们使用get_class()函数输出了对象所属的类名,并通过$this关键字引用了对象本身。在最后,我们创建了一个myClass对象,并调用了myFunction方法。

3.4 get_parent_class()

PHP提供了get_parent_class()函数,用于获取一个类的父类名。在程序中,可能需要获取一个类的父类名,这时可以使用get_parent_class()函数。

下面是一个使用get_parent_class()函数的示例:

```php

class myParentClass {

}

class myChildClass extends myParentClass {

function myFunction() {

echo get_parent_class($this);

}

}

$myObj = new myChildClass;

$myObj->myFunction();

```

在上面的示例中,我们定义了两个类myParentClass和myChildClass,并在myChildClass中定义一个myFunction方法。在这个方法中,我们使用get_parent_class()函数输出了子类的父类名,并通过$this关键字引用了子类本身。在最后,我们创建了一个myChildClass对象,并调用了myFunction方法。

3.5 method_exists()

PHP提供了method_exists()函数,用于检查一个对象是否包含指定的方法。在程序中,可能需要检查一个对象是否包含某个方法,这时可以使用method_exists()函数。

下面是一个使用method_exists()函数的示例:

```php

class myClass {

function myFunction() {

echo "这是一个方法";

}

}

$myObj = new myClass;

// 检查对象是否包含myFunction方法

if (method_exists($myObj, 'myFunction')) {

$myObj->myFunction();

}

```

在上面的示例中,我们定义了一个类myClass,并在这个类中定义一个方法myFunction。在最后,我们创建了一个myClass对象,并使用method_exists()函数检查这个对象是否包含myFunction方法。如果包含,则调用这个方法输出相应的信息。

四、总结

本文介绍了PHP异常机制、PHP异常通知以及一些你可能不知道的函数。异常机制通过抛出和捕获异常实现了程序的异常处理,异常通知通过设置全局异常处理函数和错误报告等级实现了代码调试和错误追踪。此外,本文还介绍了PHP中一些有用的函数,包括debug_backtrace()、get_included_files()、get_class()和method_exists()等等。当我们需要输出调用堆栈信息、获取已经加载的文件列表、获取对象所属的类名或检查对象是否包含某个方法时,这些函数都非常有用。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(62) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部