php错误及异常捕捉

原文:php错误及异常捕捉

在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的。

所以引用以下几中函数。

a)   set_error_handler

一般用于捕捉  E_NOTICE 、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE

不能捕捉:

E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING。

一般与trigger_error("...", E_USER_ERROR),配合使用。

<?php
// we will do our own error handling
error_reporting(0);
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
    // timestamp for the error entry
	$dt = date("Y-m-d H:i:s (T)");
	// define an assoc array of error string
	// in reality the only entries we should
	// consider are E_WARNING, E_NOTICE, E_USER_ERROR,
	// E_USER_WARNING and E_USER_NOTICE
	$errortype = array (
		E_ERROR              => ‘Error‘,
		E_WARNING            => ‘Warning‘,
		E_PARSE              => ‘Parsing Error‘,
		E_NOTICE             => ‘Notice‘,
		E_CORE_ERROR         => ‘Core Error‘,
		E_CORE_WARNING       => ‘Core Warning‘,
		E_COMPILE_ERROR      => ‘Compile Error‘,
		E_COMPILE_WARNING    => ‘Compile Warning‘,
		E_USER_ERROR         => ‘User Error‘,
		E_USER_WARNING       => ‘User Warning‘,
		E_USER_NOTICE        => ‘User Notice‘,
		E_STRICT             => ‘Runtime Notice‘,
		E_RECOVERABLE_ERROR  => ‘Catchable Fatal Error‘
	);
	// set of errors for which a var trace will be saved
	$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
	$err = "<errorentry>\n";
	$err .= "\t<datetime>" . $dt . "</datetime>\n";
	$err .= "\t<errornum>" . $errno . "</errornum>\n";
	$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
	$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
	$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
	$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
	if (in_array($errno, $user_errors)) {
		$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
	}
	$err .= "</errorentry>\n\n";
	echo $err;
}
function distance($vect1, $vect2) {
	if (!is_array($vect1) || !is_array($vect2)) {
		trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
		return NULL;
	}
	if (count($vect1) != count($vect2)) {
		trigger_error("Vectors need to be of the same size", E_USER_ERROR);
		return NULL;
	}
	for ($i=0; $i<count($vect1); $i++) {
		$c1 = $vect1[$i]; $c2 = $vect2[$i];
		$d = 0.0;
		if (!is_numeric($c1)) {
		trigger_error("Coordinate $i in vector 1 is not a number, using zero",E_USER_WARNING);
		$c1 = 0.0;
	}
	if (!is_numeric($c2)) {
		trigger_error("Coordinate $i in vector 2 is not a number, using zero",E_USER_WARNING);
		$c2 = 0.0;
	}
	$d += $c2*$c2 - $c1*$c1;
	}
	return sqrt($d);
}

$old_error_handle = set_error_handler("userErrorHandler");
$t = I_AM_NOT_DEFINED;	//generates a warning

// define some "vectors"
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);

//generate a user error
$t1 = distance($c,$b);

// generate another user error
$t2 = distance($b, "i am not an array") . "\n";

// generate a warning
$t3 = distance($a, $b) . "\n";
?>

b)   set_exception_handler

设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。

与throw new Exception(‘Uncaught Exception occurred‘),连用。

<?php
// we will do our own error handling
error_reporting(0);
function exceptHandle($errno, $errmsg, $filename, $linenum, $vars)
{
    // timestamp for the error entry
	$dt = date("Y-m-d H:i:s (T)");
	// define an assoc array of error string
	// in reality the only entries we should
	// consider are E_WARNING, E_NOTICE, E_USER_ERROR,
	// E_USER_WARNING and E_USER_NOTICE
	$errortype = array (
		E_ERROR              => ‘Error‘,
		E_WARNING            => ‘Warning‘,
		E_PARSE              => ‘Parsing Error‘,
		E_NOTICE             => ‘Notice‘,
		E_CORE_ERROR         => ‘Core Error‘,
		E_CORE_WARNING       => ‘Core Warning‘,
		E_COMPILE_ERROR      => ‘Compile Error‘,
		E_COMPILE_WARNING    => ‘Compile Warning‘,
		E_USER_ERROR         => ‘User Error‘,
		E_USER_WARNING       => ‘User Warning‘,
		E_USER_NOTICE        => ‘User Notice‘,
		E_STRICT             => ‘Runtime Notice‘,
		E_RECOVERABLE_ERROR  => ‘Catchable Fatal Error‘
	);
	// set of errors for which a var trace will be saved
	$err = "<errorentry>\n";
	$err .= "\t<datetime>" . $dt . "</datetime>\n";
	$err .= "\t<errornum>" . $errno . "</errornum>\n";
	$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
	$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
	$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
	$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
	if (1) {
		$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
	}
	$err .= "</errorentry>\n\n";
	echo $err;
}
$old_except_handle = set_exception_handler("exceptHandle");
//$t = I_AM_NOT_DEFINED;	//generates a warning
$a;
throw new Exception(‘Uncaught Exception occurred‘);
?>

c)   register_shutdown_function

执行机制是:php把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此函数。

一般与trigger_error("...", E_USER_ERROR),配合使用。

<?php
error_reporting(0);
date_default_timezone_set(‘Asia/Shanghai‘);
register_shutdown_function(‘my_exception_handler‘);

$t = I_AM_NOT_DEFINED;	//generates a warning
trigger_error("Vectors need to be of the same size", E_USER_ERROR);     

function my_exception_handler()
{
    if($e = error_get_last()) {
    //$e[‘type‘]对应php_error常量
    $message = ‘‘;
    $message .= "出错信息:\t".$e[‘message‘]."\n\n";
    $message .= "出错文件:\t".$e[‘file‘]."\n\n";
    $message .= "出错行数:\t".$e[‘line‘]."\n\n";
    $message .= "\t\t请工程师检查出现程序".$e[‘file‘]."出现错误的原因\n";
    $message .= "\t\t希望能您早点解决故障出现的原因<br/>";
	echo $message;
    //sendemail to
    }
}
?>

c) restore_error_handler()函数

定义和用法 restore_error_handler() 函数恢复之前的错误处理程序,该程序是由 set_error_handler() 函数改变的。

该函数永远返回 true。

是 set_error_handler()的反函数。

时间: 2024-10-09 02:22:25

php错误及异常捕捉的相关文章

iOS开发——错误总结&amp;异常捕捉

异常捕捉 1 有时应用崩溃,而日志中的输出信息太少,无法定位问题,这是最头疼的事情,尤其很累的时侯,已经想不起来刚才改过什么了,这就叫做无耐. 2 3 工欲善其事,必先利其器,下面的方法可以给多些信息,让你看到堆栈执行顺序,在哪里崩溃的,也就能大概给个思路,确定问题的症结. 4 5 在 AppDelegate.m 类实现之前加入: 6 7 8 9 void UncaughtExceptionHandler(NSException *exception) { 10 11 // 获取异常相关信息 1

初识Python(8)__Python错误和异常

错误和异常 ################################################################################## 参考:http://blog.csdn.net/fcoolx/article/details/4202872 http://blog.163.com/[email protected]/blog/static/279729562008719384580/ https://docs.python.org/2/library

有关错误与异常的总结

错误和异常的区别(Error vs Exception) 1)  error都是继承自父类java.lang.Error,而exception都继承自java.lang.Exception. 2)  再看看JDK中对于java.lang.Error和java.lang.Exception的解释.    java.lang.Error: An Error is a subclass of Throwable that indicates serious problems that a reason

10 错误和异常 - 《Python 核心编程》

?? 什么是异常? ?? Python 中的异常 ?? 探测和处理异常 ?? 上下文管理 ?? 引发异常 ?? 断言 ?? 标准异常 ?? 创建异常 ?? 相关模块 10.1 什么是异常人们需要一个"柔和"的处理错误的方法, 而不是终止程序. 错误 从软件方面来说, 错误是语法或是逻辑上的. 当 Python 检测到一个错误时, 解释器就会指出当前流已经无法继续执行下去. 这时候就出现了异常. 语法错误 语法错误指示软件的结构上有错误, 导致不能被解释器解释或编译器无法编译. 逻辑错误

Android全局异常捕捉

// 定义自定义捕捉 package com.xiaosw.test; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.lang.Thread.UncaughtExceptionHandler;

(插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。

最近 做些准备性得工作和有意思的事情.所以最近做了一个适合ios和android 错误信息捕捉的unity插件. 两个功能,app崩溃也就是闪退 是开发者 很头疼的一件事,还有就是一些莫名得错误 有时候也会困扰着我们.现在,unity已经封装得挺好了,及时出现数组越界,和空对象这样严重得错误也不会崩溃,听着挺好,但是这给开发者带了很多烦恼啊.因为有时候可能出错了 你要跟就不知道 ,在什么地方出得错误啊.所以我们要想办法去解决这个问题. 我们都知道及时app崩溃,其实后台还是在运行得 只不过是 到

Oracle- 存储过程和异常捕捉

最近工作有点忙,没什么时间在上班时间进修一下,自己晚上有时候去打打球,回家看看电视剧,日子一天天过…….前段时间看到公司有用到ORACLE,而我一直都觉的ORACLE对于我来说是很重的,所以这个周末花了点时间学习一些基础下. 创建无参存储过程 create procedure p_myPro1 is begin insert into dept(deptno,dname,loc) values(60,'ccx','321321'); end; 修改无参存储过程 create or replace

Java多线程——&lt;七&gt;多线程的异常捕捉

一.概述 为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void run() { throw new RuntimeException(); } //现象:控制台打印出异常信息,并运行一段时间后才停止 public static void main(String[] args){ //就算把线程的执行语句放到try-catch块中也无济于事 try{ Execu

Python3 错误和异常

Edit 笔记内容:Python3 错误和异常 笔记日期:2017-11-12 Python3 错误和异常 语法错误 异常 异常处理 抛出异常 用户自定义异常 finally语句 预定义的清理行为 异常处理机制概述: 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件).通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃. 就好比一个旅游景点,每到一个有可能出现问题情况的地方就会设置一个处理问题的处理