【问题标题】:rethrowing exception difficulty -- exception crashes program rather than rethrows重新抛出异常困难——异常使程序崩溃而不是重新抛出
【发布时间】:2019-12-10 19:22:31
【问题描述】:

我正在捕获异常并对其进行处理。 在调用树的某个地方,我也在做同样的事情。 一旦我在子级别处理我的异常,我还想继续调用异常处理程序,无论它在哪里,在调用树的某个位置。

为此,我想我会再次投掷。 但是,它不是在调用树的某个地方中断,而是在我进行投掷和崩溃的地方中断,在这一行:

throw new Exception("Cannot Write Header Row to Database " + Msg);

代码:

public static void NewHeaderRow(string FILE_REV_NUMBER, DateTime FILE_CREATE_DATE, string EDC_DUNS_NUMBER, int RunId)
{

    SqlConnection connection = null;

    try
    {
        connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString());
        connection.Open();
        SqlCommand com;
        com = new SqlCommand("dbo.INSERT_PPL_HEADER", connection);


        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.Add(new SqlParameter("@FILE_REV_NUMBER", FILE_REV_NUMBER));
        com.Parameters.Add(new SqlParameter("@FILE_CREATE_DATE", FILE_CREATE_DATE));
        com.Parameters.Add(new SqlParameter("@EDC_DUNS_NUMBER", EDC_DUNS_NUMBER));
        com.Parameters.Add(new SqlParameter("@RunId", RunId));


        if (com.Connection.State == ConnectionState.Closed) com.Connection.Open();

        com.ExecuteNonQuery();

    }
    catch (Exception e)
    {
        string Msg;
        Msg = "Encountered unexpected program issue.  Please contact your program administator.  Error details...";
        Msg = Msg + System.Environment.NewLine;
        Msg = Msg + System.Environment.NewLine;
        Msg = Msg + e.ToString();
        Msg = Msg + System.Environment.NewLine;
        Msg = Msg + System.Environment.NewLine;
        Msg = Msg + e.Message;

        throw new Exception("Cannot Write Header Row to Database " + Msg);
    }
    finally
    {
        if (connection == null) { } else connection.Close();
    }

}

【问题讨论】:

  • 基于该链接,我似乎做得对,但它不起作用....处理程序是否必须在调用此方法的方法中,或者它可以是几个在调用堆栈上指向上方?
  • @kammistry,错误会“向上”传播——当它们被抛出时,它们会一直向上调用堆栈,直到它们被处理或程序崩溃。该处理程序可以是调用堆栈中最初引发错误的方法“之上”的几个方法。

标签: c# exception try-catch


【解决方案1】:

我最终能够查明问题的方法是极大地简化我的代码,以便能够清楚地看到问题。我只是将我的解决方案复制到了一个新位置,并删除了所有非必要的东西——我知道对于故障排除而言并不重要的东西......解决难以解决的难题的非常有效的方法跟踪......这是我最终得到的(简单的代码)。

我没有在调用 NewHeaderRow 的代码中发现一般异常。 我正在捕捉 System.IO 异常。 所以,因为代码无处可去,它崩溃了...... 这个错误眼睛很难捕捉,也很难追踪。

private void button1_Click(object sender, EventArgs e)
{
    LoadFile();

}

private static int ProcessHeaderRow(string line)
{

    int LoadRunNumber = 0;

    try
    {
        //some complex logic was here; error occurs here, so I throw an exception....
        throw new Exception("An Error Occurs -- Process Header Row Try block");
    }
    catch (CustomExceptionNoMessage e)
    {
        throw new CustomExceptionNoMessage(e.Message);
    }
    catch (Exception e)
    {
        //Process the exception, then rethrow, for calling code to also process the exception....
        //problem is here...XXXXXXXXXXXXXXXXXX
        throw new Exception(e.Message);  //crashes

    }
    return LoadRunNumber;
}

public static bool LoadFile()
{

    int RunId = 0;

    try
    {
        RunId = ProcessHeaderRow("10~~happy~007909427AC");
        MessageBox.Show("Completed Upload to Cloud...");
    }
    catch (CustomExceptionNoMessage ce)
    {
        MessageBox.Show(ce.Message);
    }
    catch (System.IO.IOException e)   //CHANGED THIS LINE, AND I AM UP AND RUNNING (Changed to Exception e)
    {
        MessageBox.Show(e.Message);
    }

    return true;
}


    public class CustomExceptionNoMessage : Exception
    {
        public CustomExceptionNoMessage()
        {
        }

        public CustomExceptionNoMessage(string message)
            : base(message)
        {
        }

        public CustomExceptionNoMessage(string message, Exception inner)
            : base(message, inner)
        {
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        LoadFile();

    }

【讨论】:

  • 很好的解释,帮助我弄清楚了我的问题。
【解决方案2】:

尝试只使用 throw 关键字,而不是构建新的异常。

https://stackoverflow.com/a/2999314/5145250

【讨论】:

  • 如果您认为此问题重复,请标记/投票以关闭帖子而不是添加新答案。
  • 我不认为它是重复的。我认为答案与另一个问题相同,但问题不同。
  • 没用。仍然因与我遇到的错误相同的错误而崩溃......
  • 我认为这是您想要的行为?如果不是,它向我表明您没有以正确的方式在上游处理异常。也许您有一些中间件在异常处理程序之前捕获并抛出异常?我会尝试降低复杂性以根除问题。在您的 NewHeaderRow 方法的顶部,抛出一个新异常并查看它是否得到正确处理。
【解决方案3】:

要向异常添加附加信息,将其扭曲到另一个异常对象中,并将原始异常作为新消息的参数传递,以将原始堆栈跟踪保留在内部异常中。

throw new Exception("Cannot Write Header Row to Database " + Msg,  e);

在某些顶层,您应该处理全局异常以避免崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2016-08-20
    相关资源
    最近更新 更多