我觉得我在思考这个问题或者说错误的方法,但我想要做的就是捕获我的应用程序中抛出的错误,将它们记录在数据库中,然后重定向到一个软错误页面。
在我的Global.asax中,我有以下内容:
protected void Application_Error(object sender, EventArgs e)
{
try
{
ErrorLog error = new ErrorLog(Server.GetLastError().GetBaseException(), true);
Response.Redirect("/error.aspx?id=" + error.ID);
}
catch(Exception err)
{
Response.Redirect("/error.aspx");
}
}
错误日志是我创建的一个类,它执行记录插入和类似的东西。
现在我遇到的问题是,如果数据库存在某些问题,例如它处于脱机状态,存储过程中的错误等,我会陷入插入错误的无限循环。
我试图解决此问题的解决办法是检查是否已经抛出错误,如果是,请不要尝试尝试记录插入,但我无法找到很多。
再说一遍,也许我不会以正确的方式去做这件事?任何帮助将不胜感激。先谢谢你。
答案 0 :(得分:1)
实际上可以做到这一点,但我真的认为这不是一个好主意。
理论上你可以使用Marshal.GetExceptionPointers()
来检测它。如果它返回IntPtr.Zero,则可能意味着在飞行中没有例外;否则,它可能意味着有。
我说“可能”,因为Marshal.GetExceptionPointers()
的MSDN文档在备注中说:
GetExceptionPointers仅用于编译器支持结构化异常处理(SEH)。
这听起来像一个大胖子“不要用这个”给我。
根据该附带条件,该程序实际上会告诉您是否有异常处于运行状态,而不使用try / catch来执行此操作:
警告:提前讨厌的代码
using System;
using System.Runtime.InteropServices;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
try
{
using (new Test())
{
// All is well.
}
using (new Test())
{
throw new InvalidOperationException("Eeep");
}
}
catch (Exception ex)
{
Console.WriteLine("Exception detected: " + ex.Message);
}
}
}
sealed class Test: IDisposable
{
public void Dispose()
{
Console.WriteLine(
Marshal.GetExceptionPointers() == IntPtr.Zero
? "Disposing test normally."
: "Disposing test because of an exception.");
}
}
}
答案 1 :(得分:0)
您可以检查您是否已经在该页面上,并且仅在您不是以下时重定向:
string cTheFile = HttpContext.Current.Request.Path;
if(!cTheFile.EndsWith("error.aspx", StringComparison.InvariantCultureIgnoreCase))
Response.Redirect("/error.aspx");
答案 2 :(得分:0)
使用ErrorLogDBInsertException覆盖Exception类,如果DB内容不好,则抛出此类。捕获特定错误
protected void Application_Error(object sender, EventArgs e)
{
try
{
ErrorLog.Log();
Response.Redirect("/error.aspx?id=" + error.ID);
}
catch(ErrorLogDBInsertException err)
{
try
{
// here you can log into event log
}
catch {}
Response.Redirect("/SimpleNoDBCallPage_error.aspx");
}
catch(Exception err)
{
Response.Redirect("/PageThatCallsDB_error.aspx");
}
}