我正在学习PHP,同时编写玩具代码以了解我的学习内容。
这些是我的"错误和异常处理程序"功能。
我的意图是:
function display_exception($exception)
{
print_r($exception);
}
function log_error_or_exception($error_type, $error_message, $error_number = null, $file_name = null, $line_number = null)
{
$text = 'Message: ' . $error_message . ' - ErrorType: ' . $error_type;
if ($error_number) {
$text .= ' - Error#: ' . $error_number;
}
if ($file_name) {
$text .= ' -> ' . $file_name;
}
if ($line_number) {
$text .= ':' . $line_number;
}
syslog(LOG_ERR, $text);
}
/**
* This function logs any uncaught exception that has been thrown.
* If in the "dev" environment it also displays the Exception
*
* @var Exception $exception
* @return void
*/
function custom_exception_handler($exception)
{
if (ENV == 'dev') {
display_exception($exception);
}
log_error_or_exception(get_class($exception), $exception->getMessage(), $exception->getCode(), $exception->getFile(), $exception->getLine());
}
/**
* This function converts an "old style" PHP Error in an ErrorException
*
* @var int $errno
* @var string $errstr
* @var string|null $errfile
* @var int|null $errline
* @var array $errcontext
* @return false|void
*/
function custom_error_handler(int $errno, string $errstr, string $errfile = null, int $errline = null, array $errcontext = array())
{
// if error_reporting() is false it means that the error was trigger by a line having
// the error control operator "@" so the error should never be displayed.
// Sometimes thought it's convenient to log it
if (!error_reporting()) {
if (ENV == 'dev') {
log_error_or_exception('Error', $errstr, $errno, $errfile, $errline);
}
return false;
}
throw new ErrorException($errstr, $errno, 1, $errfile, $errline);
echo "this should not be displayed";
}
set_exception_handler('custom_exception_handler');
set_error_handler('custom_error_handler');
现在我有了一个对象
<?php
require_once 'app/src/ErrorExceptionHandlers.php';
class Obj
{
public function method($value){
$result = preg_match('/@/', $value);
}
}
如果我运行此代码,一切都按预期工作:
define('ENV', 'dev');
$object = new Obj;
$object->method(array());
我明白了:
ErrorException Object
(
[message:protected] => preg_match() expects parameter 2 to be string, array given
[string:Exception:private] =>
...
)
如果我尝试运行这个phpunit测试
<?php
require_once 'app/src/models/obj.php';
define('ENV', 'dev');
class ObjTest extends \PHPUnit_Framework_TestCase
{
/**
* @ExpectedException ErrorException
*/
public function test_method(){
$object = new Obj();
$object->method(array());
}
}
我明白了:
There was 1 error:
1) ObjTest::test_method
ErrorException: preg_match() expects parameter 2 to be string, array given
为什么测试失败?
答案 0 :(得分:2)
因此,注释名称区分大小写。if (info === 'OK') {
// login.php says login succeeded, bounce user to dashboard
window.location.href = 'http://successful/login/url';
} else {
// login.php says login failed, show the output it gave us
$("#login_errors").html(info)
}
应为@ExpectedException