优秀的编程知识分享平台

网站首页 > 技术文章 正文

Slim框架学习笔记之Error Handling

nanyue 2024-07-30 03:19:20 技术文章 12 ℃

1. 概述

让我们面对现实:有时出问题。拦截错误并适当地回应它们非常重要。Slim应用程序提供帮助方法来响应错误和异常。

重要笔记

Slim应用程序尊重您现有的error_reporting设置;

Slim应用程序仅处理Slim应用程序内生成的错误和异常;

Slim应用程序将错误转换为ErrorException对象并抛出它们;

如果Slim应用程序的debug设置为true,则使用其内置错误处理程序; 否则,它使用自定义错误处理程序。

2.500 System Error

您可以使用Slim应用程序的error()方法来指定在发生错误或异常时要调用的自定义错误处理程序。仅在禁用应用程序调试时才会调用自定义错误处理程序。

自定义错误处理程序应呈现用户友好的消息,以减轻用户的混淆。与Slim应用程序的notFound()方法类似,该error()方法既充当getter又充当setter。

设置定制错误处理程序

您可以通过将可调用函数error()作为其第一个也是唯一的参数传递给Slim应用程序的方法来设置自定义错误处理程序。

<?php

$app = new \Slim\Slim();

$app->error(function (\Exception $e) use ($app) {

$app->render('error.php');

});

在此示例中,自定义错误处理程序接受捕获的Exception作为其参数。这允许您适当地响应不同的异常。

调用自定义错误处理程序

通常,Slim应用程序将在发生异常或错误时自动调用错误处理程序。但是,您也可以使用Slim应用程序的error()方法手动调用错误处理程序(不带参数)。

3.404 Not Found

有人会要求不存在的页面是不可避免的。Slim应用程序允许您使用Slim应用程序的notFound()方法轻松定义自定义Not Found处理程序。当找不到当前HTTP请求的匹配路由时, 将调用Not Found处理程序。此方法充当getter和setter。

设置未找到处理程序

如果调用Slim应用程序的notFound()方法并将可调用对象指定为其第一个也是唯一的参数,则此方法将可调用对象注册为Not Found处理程序。但是,不会调用已注册的处理程序。

<?php

$app = new \Slim\Slim();

$app->notFound(function () use ($app) {

$app->render('404.html');

});

调用未找到的处理程序

如果在notFound()没有任何参数的情况下调用Slim应用程序的方法,则此方法将调用先前注册的Not Found处理程序。

<?php

$app = new \Slim\Slim();

$app->get('/hello/:name', function ($name) use ($app) {

if ( $name === 'Waldo' ) {

$app->notFound();

} else {

echo "Hello, $name";

}

});

4.Debug Mode

您可以使用以下设置在应用程序实例化期间启用调试:

<?php

$app = new \Slim\Slim(array(

'debug' => true

));

您还可以在运行时使用Slim应用程序的config()实例方法启用调试:

<?php

$app = new \Slim\Slim();

//Enable debugging (on by default)

$app->config('debug', true);

//Disable debugging

$app->config('debug', false);

如果启用了调试并发生异常或错误,则将显示诊断屏幕,其中包含错误说明,受影响的文件,文件行号和堆栈跟踪。如果禁用调试,则将调用自定义错误处理程序。

5. Output

Slim应用程序的环境将始终包含一个键slim.errors,其值为可写入的资源,可以写入日志和错误消息。每当捕获到异常或手动调用日志对象时,Slim应用程序的日志对象都会将日志消息写入slim.errors。

如果要将错误输出重定向到其他位置,可以通过修改Slim应用程序的环境设置来定义自己的可写资源。我建议您使用中间件来更新环境:

<?php

class CustomErrorMiddleware extends \Slim\Middleware

{

public function call()

{

// Set new error output

$env = $this->app->environment;

$env['slim.errors'] = fopen('/path/to/output', 'w');

// Call next middleware

$this->next->call();

}

}

请记住,slim.errors不必指向文件; 它可以指向任何有效的可写资源。

Tags:

最近发表
标签列表