也许我在PHP手册的某个地方遗漏了它,但是错误和异常之间究竟有什么区别?我能看到的唯一区别是错误和异常的处理方式不同.但是什么导致异常以及导致错误的原因是什么?
我目前正在ASP.NET MVC应用程序中使用log4net来记录异常.我这样做的方法是让我的所有控制器继承自BaseController类.在BaseController的OnActionExecuting事件中,我记录可能发生的任何异常:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在控制器操作期间发生未处理的异常,则此方法很有用.
至于404错误,我在web.config中设置了自定义错误,如下所示:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)
在处理"页面未找到"网址的控制器操作中,我记录了所请求的原始网址:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Run Code Online (Sandbox Code Playgroud)
这也有效.
我遇到的问题是如何记录.aspx页面本身的错误.假设我在其中一个页面或某些内联代码上出现编译错误,这将导致异常:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Run Code Online (Sandbox Code Playgroud)
似乎HandleError属性正确地将其重新路由到Shared文件夹中的Error.aspx页面,但它肯定没有被我的BaseController的OnActionExecuted方法捕获.我想我可以将日志代码放在Error.aspx页面本身,但我不确定如何在该级别检索错误信息.
我正在网上测试一个网站.
现在,错误没有显示(但我知道它们存在).
我只能访问该.htaccess文件.
如何使用我的.htaccess文件显示所有错误
编辑
我将这些行添加到我的.htaccess:
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
Run Code Online (Sandbox Code Playgroud)
和页面现在显示
内部服务器错误
我有一些基本代码来确定我的MVC应用程序中的错误.目前在我的项目,我有一个名为控制器Error与操作方法HTTPError404(),HTTPError500()和General().它们都接受一个字符串参数error.使用或修改下面的代码.将数据传递给Error控制器进行处理的最佳/正确方法是什么?我想尽可能提供强大的解决方案.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to …Run Code Online (Sandbox Code Playgroud) 你将如何实现不同类型的错误,这样你就能捕捉到特定错误并让其他人冒出来......?
实现此目的的一种方法是修改Error对象的原型:
Error.prototype.sender = "";
function throwSpecificError()
{
var e = new Error();
e.sender = "specific";
throw e;
}
Run Code Online (Sandbox Code Playgroud)
捕获特定错误:
try
{
throwSpecificError();
}
catch (e)
{
if (e.sender !== "specific") throw e;
// handle specific error
}
Run Code Online (Sandbox Code Playgroud)
你有没有其他选择?
由于Go中的错误处理,我经常最终得到多个值函数.到目前为止,我管理它的方式非常混乱,我正在寻找编写更清晰代码的最佳实践.
假设我有以下功能:
type Item struct {
Value int
Name string
}
func Get(value int) (Item, error) {
// some code
return item, nil
}
Run Code Online (Sandbox Code Playgroud)
如何item.Value优雅地分配新变量.在介绍错误处理之前,我的函数刚刚返回item,我可以简单地执行此操作:
val := Get(1).Value
Run Code Online (Sandbox Code Playgroud)
现在我这样做:
item, _ := Get(1)
val := item.Value
Run Code Online (Sandbox Code Playgroud)
有没有办法直接访问第一个返回的变量?
我目前在php 5.4上运行一个站点,在此之前我在5.3.8上运行我的站点.不幸的是,PHP 5.4联合收割机E_ALL和E_STRICT,这意味着我以前的设置error_reporting现在无法正常工作.我之前的价值是E_ALL & ~E_NOTICE & ~E_STRICT我应该一次启用一个值吗?
我有太多错误,文件中包含太多代码供我修复.
我运行一个ASP.NET站点,我有问题,只需手动测试就可以找到一些JavaScript错误.
是否有可能捕获客户端上的所有JavaScript错误并将其记录在服务器上,即在EventLog中(通过Webservice或类似的东西)?
ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Run Code Online (Sandbox Code Playgroud)
如何将错误消息作为字符串?
我目前有一个类似的脚本
./a | ./b | ./c
Run Code Online (Sandbox Code Playgroud)
我想修改它,以便如果a,b或c中的任何一个退出并带有错误代码我打印错误消息并停止而不是向前输出错误的输出.
最简单/最干净的方法是什么?
error-handling ×10
php ×3
asp.net-mvc ×2
javascript ×2
.htaccess ×1
asp.net ×1
c# ×1
c++ ×1
exception ×1
go ×1
logging ×1
pipe ×1
return-value ×1
shell ×1
std ×1
stream ×1