YII异常处理actionError

zccst转

错误处理目录
1,引发异常
2,显示错误
3,使用一个动作来处理错误
4,消息记录

Yii提供了一个完整的,基于PHP5异常处理的错误处理机制。当一个应用开始运行,进行用户请求的处理的时候,会注册handleError方法来处理PHP warnings和notices信息;同时也注册加handleException方法来处理未被捕获的PHP异常。因此,如果在应用运行期间出现一个PHP warning/notice 或者一个未捕获的PHP异常,错误处理器就会接过控制权来运行必要的处理机制。

提示: 错误处理器的注册是在应用中的constructor方法中进行的,使用了PHP函数set_exception_handler 和set_error_handler。 如果你不想让Yii来处理错误和异常,你可以在入口文件中定义YII_ENABLE_ERROR_HANDLER和YII_ENABLE_EXCEPTION_HANDLER为false.

默认情况下,在触发onError事件(或onException事件)的时候,errorHandler(或exceptionHandler)将被触发。如果错误或者异常未被任何事件所处理,那么就需要运行errorHandler组件来处理了。

[b]1. 引发异常 [/b]
在Yii中引发异常和在普通PHP文件中没什么两样。你可以使用下面的代码来抛出异常:

throw new ExceptionClass('错误信息');
Yii定义了两个异常类:CException和CHttpException。前者是一个通用的异常类,而后者用于对最终用户显示异常信息。同时,后者有一个statusCode属性来代表HTTP状态码。异常的类型决定了显示效果,下面会细说。

提示: 想要告诉用户某个操作是错误的,那么引发一个CHttpException异常是最简单的方法了。比如说,如果用户在URL中提供了一个无效的ID值,我们可以显示一个404错误:

// 如果提交的ID是无效的
throw new CHttpException(404,'此页面不存在');


[b]2. 显示错误 [/b]
当一个错误被转发给组件CErrorHandler的时候,它会选择合适的视图来显示错误。如果这个错误要显示给最终用户的(比如说一个CHttpException)那么会使用名为errorXXX的视图来显示错误。这个XXX代表着HTTP错误码(比如说400,404,500等)。如果这是个内部错误,应该只能被开发者看到,那么将使用的视图名是exception。在后一种中,将会显示完整的调用栈信息和错误行信息。

信息: 当应用运行在生产模式时,所有的错误,包括内部错误都会使用视图errorXXX。这是因为调用的栈信息和错误行信息可能包含一些敏感信息。这种情况下,开发者应该依靠错误日志来确定错误原因。

CErrorHandler会搜索合适的视图来显示错误信息,搜索的顺序如下:

WebRoot/themes/ThemeName/views/system: 在当前主题视图下的system目录中。

WebRoot/protected/views/system: 在应用的默认视图的system目录中。

yii/framework/views: 在Yii提供的标准视图目录中。

因此,如果你想要自定义错误显示,可以直接在system视图目录中或者主题的system视图目录中创建一个视图文件。每个视图文件都是一个包含许多HTML代码的普通PHP文件。参考框架的view目录下的文件,可以获得更多信息。

[b]3. 使用一个动作来处理错误 [/b]
Yii也可以使用控制器 动作来处理错误显示。实现的方法是在应用的配置文件中配置一个错误处理器。

return array(
......
'components'=>array(
'errorHandler'=>array(
'errorAction'=>'site/error',
),
),
);
上面的代码中,我们配置了CErrorHandler::errorAction属性,属性值是一个路由site/error。这个路由指向SiteController中的error。当然,你也可以使用其他的路由。

我们可以这样来编写error动作:

public function actionError()
{
if($error=Yii::app()->errorHandler->error)
$this->render('error', $error);
}
在这个动作中,首先从CErrorHandler::error中取得详细的错误信息。如果取得的信息非空,就使用CErrorHandler::error返回的信息来渲染error视图。CErrorHandler::error返回的信息是一个数组,结构如下:

code: HTTP 状态码(比如 403, 500);
type: 错误类型(比如 CHttpException, PHP Error);
message: 错误信息;
file: 发生错误的PHP文件名;
line: 错误所在的行;
trace: 错误的调用栈信息;
source: 发生错误的代码的上下文。
提示: 我们检查CErrorHandler::error是否为空的原因是error动作可以被用户访问到,这时候也许并没有什么错误。当我们传递$error数组给视图,它将会被自动释放为独立的变量。所以,在视图中我们可以使用$code,$type来访问这些信息。

[b]4. 消息记录 [/b]
一个error级别的错误信息会在错误发生时候被记录。如果这个错误是由PHP warning 或 notice引发的,那么这个消息将会被记录在php这个分类中;如果错误信息是由未捕获的异常所引起的,那么分类将是exception.ExceptionClassName(对于CHttpException来说,它的statusCode也将被追加到分类名中)。开发者可以使用这些记录来监测应用执行时候的错误信息

参考资料
[url]http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.error[/url]


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
[img]http://dl2.iteye.com/upload/attachment/0109/0668/fb266dfa-95ca-3d09-b41e-5f04a19ba9a1.png[/img]
### 回答1: urllib.error.httperror: http错误400:错误的请求 这个错误通常是由于请求中包含无效的参数或格式不正确引起的。您需要检查您的请求并确保它符合API的要求。如果您不确定如何解决这个问题,请参考API文档或联系API提供商的支持团队。 ### 回答2: urllib.error.httperror: http error 400: bad request是一个Python库urllib中的一个错误类型,出现这个错误的原因是向服务器发送了一个格式错误的请求。 简单来说,当我们向服务器提交请求时,如果请求的格式不正确,服务器就会返回一个HTTP 400错误,告诉我们请求有误,无法解析。这个错误通常是客户端或者浏览器出现了错误,而不是服务器出现了问题。 具体来说,常见的请求格式错误包括以下几种: 1. 请求缺少必要参数或者参数格式不正确,如参数类型错误、参数长度不足等。 2. 请求数据格式与API接口要求不一致,如请求头不正确、请求字段值不合法等。 3. 请求的地址或者端口错误,如URL连接不正确或者端口号设置有误。 要解决这个问题,我们需要检查请求参数、请求数据、请求地址和端口是否正确,并根据错误提示信息进行相应的调整和处理。 例如,我们可以检查请求参数,看看是否符合API接口的要求,并对其进行修正。此外,我们还可以使用其他Python库进行请求,或者手动发送请求,以便更好地理解请求发送过程中可能会遇到的问题。 总之,要解决urllib.error.httperror: http error 400: bad request这个错误,我们需要仔细检查请求的参数、数据、地址和端口,并根据错误提示信息对其进行调整和处理。 ### 回答3: urllib是Python自带的HTTP客户端库,在使用它发送HTTP请求时,可能会遇到http error 400: bad request的错误。这个错误表示请求与服务器期望的不一致,可能原因有以下几个方面: 1.请求参数不正确。如果服务器要求包含某个参数,但请求中没有带上,就会收到http error 400错误。此时需要检查请求参数是否正确,并确保已将完整的请求参数传递给urllib。 2.请求头信息不正确。服务器一般会对请求头提出一定的要求,如果请求头不符合要求,就可能出现400错误。此时需要检查请求头是否正确,并确保发送的请求头信息与服务器要求的一致。 3.请求数据格式不正确。在使用POST方法发送数据时,如果数据格式不正确,也有可能收到http error 400的错误。此时需要检查请求数据格式是否正确,并确保发送的数据格式与服务器要求的一致。 4.服务器故障。如果服务器出现故障,也可能会收到http error 400的错误。此时需要检查服务器是否正常运行,或者尝试稍后再次发送请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值