1

我觉得我想得太多了,或者可能走错了路,但我想做的只是捕捉应用程序中抛出的错误,将它们记录到数据库中,然后重定向到软错误页。

在我的 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");
        }           
    }

错误日志是我创建的一个类,它执行记录插入和类似的东西。

现在我遇到的问题是,如果数据库出现问题,比如它处于脱机状态、存储过程中的错误等,我就会陷入插入错误的无限循环。

我试图提出的解决此问题的解决方案是检查是否已经抛出错误,如果是,请不要尝试插入记录,但我无法找到太多关于此的内容.

再说一次,也许我不会以正确的方式解决这个问题?任何帮助将不胜感激。提前谢谢你。

4

3 回答 3

5

实际上可以做到这一点,但我真的不认为这是一个好主意。

你理论上可以Marshal.GetExceptionPointers()用来检测它。如果返回 IntPtr.Zero,则可能表示飞行中没有异常;否则,它可能意味着存在。

我说“可能”是因为 MSDN 文档Marshal.GetExceptionPointers()在备注下说:

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.");
        }
    }
}
于 2013-05-03T18:12:17.407 回答
0

您可以检查您是否已经在该页面上,并且仅当您不是时才重定向:

string cTheFile = HttpContext.Current.Request.Path;

if(!cTheFile.EndsWith("error.aspx", StringComparison.InvariantCultureIgnoreCase))
    Response.Redirect("/error.aspx");
于 2013-05-03T17:38:10.610 回答
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");
    }           
}
于 2013-05-03T17:48:10.173 回答