c#如何检查是否已抛出异常

时间:2013-05-03 17:31:09

标签: c# asp.net error-handling

我觉得我在思考这个问题或者说错误的方法,但我想要做的就是捕获我的应用程序中抛出的错误,将它们记录在数据库中,然后重定向到一个软错误页面。

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

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

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

我试图解决此问题的解决办法是检查是否已经抛出错误,如果是,请不要尝试尝试记录插入,但我无法找到很多。

再说一遍,也许我不会以正确的方式去做这件事?任何帮助将不胜感激。先谢谢你。

3 个答案:

答案 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");
    }           
}