C# 创建属性以检查异常
我正在创建一个属性,这样每当我的站点出现异常时,我都会收到一封详细说明异常的电子邮件。到目前为止,我已经知道了,但如果发生异常,我的属性代码似乎不会触发:C# 创建属性以检查异常,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正在创建一个属性,这样每当我的站点出现异常时,我都会收到一封详细说明异常的电子邮件。到目前为止,我已经知道了,但如果发生异常,我的属性代码似乎不会触发: public class ReportingAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { // This will generate an ema
public class ReportingAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
// This will generate an email to me
ErrorReporting.GenerateEmail(filterContext.Exception);
}
}
然后在我的控制器上方我正在做:
[ReportingAttribute]
public class AccountController : Controller
另一种方法当然是将
ErrorReporting.GenerateEmail(ex)
放在我的catch块中?一定有更简单的方法吗?这就是为什么我想到创建属性来处理这个问题。为了记录所有未捕获的异常,您可以在Global.asax.cs
文件中定义以下方法:
private void Application_Error(object sender, EventArgs e)
{
try
{
//
// Try to be as "defensive" as possible, to ensure gathering of max. amount of info.
//
HttpApplication app = (HttpApplication) sender;
if(null != app.Context)
{
HttpContext context = app.Context;
if(null != context.AllErrors)
{
foreach(Exception ex in context.AllErrors)
{
// Log the **ex** or send it via mail.
}
}
context.ClearError();
context.Server.Transfer("~/YourErrorPage");
}
}
catch
{
HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
为了记录所有未捕获的异常,您可以在
Global.asax.cs
文件中定义以下方法:
private void Application_Error(object sender, EventArgs e)
{
try
{
//
// Try to be as "defensive" as possible, to ensure gathering of max. amount of info.
//
HttpApplication app = (HttpApplication) sender;
if(null != app.Context)
{
HttpContext context = app.Context;
if(null != context.AllErrors)
{
foreach(Exception ex in context.AllErrors)
{
// Log the **ex** or send it via mail.
}
}
context.ClearError();
context.Server.Transfer("~/YourErrorPage");
}
}
catch
{
HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
属性本身不能定义行为,但它用于在代码数据上做一些标记。你应该写一段代码
- 破例
- 检查引发异常的方法中是否存在给定属性
- 如果有,收集并发送所需的数据
属性本身不能定义行为,但它用于在代码数据上做一些标记。你应该写一段代码
- 破例
- 检查引发异常的方法中是否存在给定属性
- 如果有,收集并发送所需的数据
为什么不创建一个基本控制器:
public ApplicationBaseController : Controller
{
public override void OnException(ExceptionContext context)
{
//Send your e-mail
}
}
并从ApplicationBaseController
public HomeController : ApplicationBaseController
{
//.....
}
为什么不创建一个基本控制器:
public ApplicationBaseController : Controller
{
public override void OnException(ExceptionContext context)
{
//Send your e-mail
}
}
并从ApplicationBaseController
public HomeController : ApplicationBaseController
{
//.....
}
我想把所有的异常都发出去,不管我是否抓到了它们。如果你抓到了一个异常,并且没有重新抛出它,这难道不意味着应用程序可以正常运行吗?如果可以的话,为什么你需要邮寄例外?在极少数情况下,当您确实需要它时,您可以在catch
块中手动编写一行代码。所有未捕获(或重新捕获)的异常都将自动发送给您。好吧,我给您举个例子:我的应用程序严重依赖于我的Web服务,如果出于任何原因出现故障,我需要注销用户并告诉他们发生了错误。这很好,但作为一个额外的功能,我希望收到一封电子邮件,说明存在问题,以便我可以尝试尽早修复它,现在我有一个try/catch方法来捕获此异常,但我认为最好先创建一个属性或其他东西,而不是手动将此代码写入每个catch块,我认为没有任何方法可以对未处理的异常做出反应。其次,正如我所建议的,您还可以在一个地方实现注销逻辑-Application\u Error()
。因此,只需遵循一条通用规则——不要接受无法恢复的异常。让它们冒泡到Application\u Error()
,并让它对此类异常进行一般处理。我已采纳您的建议,将我的代码放入catch块,然后对于未处理的异常,我将使用Application\u错误消息,谢谢!我想把所有的异常都发出去,不管我是否抓到了它们。如果你抓到了一个异常,并且没有重新抛出它,这难道不意味着应用程序可以正常运行吗?如果可以的话,为什么你需要邮寄例外?在极少数情况下,当您确实需要它时,您可以在catch
块中手动编写一行代码。所有未捕获(或重新捕获)的异常都将自动发送给您。好吧,我给您举个例子:我的应用程序严重依赖于我的Web服务,如果出于任何原因出现故障,我需要注销用户并告诉他们发生了错误。这很好,但作为一个额外的功能,我希望收到一封电子邮件,说明存在问题,以便我可以尝试尽早修复它,现在我有一个try/catch方法来捕获此异常,但我认为最好先创建一个属性或其他东西,而不是手动将此代码写入每个catch块,我认为没有任何方法可以对未处理的异常做出反应。其次,正如我所建议的,您还可以在一个地方实现注销逻辑-Application\u Error()
。因此,只需遵循一条通用规则——不要接受无法恢复的异常。让它们冒泡到Application\u Error()
,并让它对此类异常进行一般处理。我已采纳您的建议,将我的代码放入catch块,然后对于未处理的异常,我将使用Application\u错误消息,谢谢!IExceptionFilter.OnException()
是否仅在未处理的异常上调用?是否IExceptionFilter.OnException()
仅在未处理的异常上调用?我尝试了此操作,但在异常发生时未收到任何电子邮件您确定您的电子邮件设置配置正确吗?请注意,此方法仅在未处理的异常情况下调用。我尝试了此方法,但在发生异常时未收到任何电子邮件。您确定您的电子邮件设置配置正确吗?请注意,此方法仅在未处理的异常上调用