0

如果我在我的代码中散布了这些:

MessageBox.Show("See a format exception yet? #1");//todo: remove

(其中有7个,从1..7开始编号,大部分显示(1,2,5,6,7))

我最终得到一个错误消息(“异常:找不到表 0 位置:frmFunction.SetPlatypus ”)

如果我注释掉所有这些,我最终会得到一个不同的错误消息(“异常:FormatException Location frmFunction.getDuckbillRecord ”)

这怎么可能?这样的信息 msg 的存在/显示不应该对代码执行的方式/它所采用的路径等没有影响吗?

注意:getDuckbillRecord() 是所有 MessageBox 所在的位置。

更新

以 RT 的建议为动力,我想出了这个:

public static StringBuilder LogMsgs = new StringBuilder();

    public static void ExceptionHandler(Exception ex, string location)
    {
        try
        {
            LogMsgs.Append(string.Format("{0}\r\n", ex.Message)); //TODO: Comment out before deploying?
            DateTime dt = DateTime.Now;
            string timeAsStr = string.Format("{0}_{1}_{2}_{3}.txt", dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
            using (StreamWriter file = new StreamWriter(timeAsStr))
            {
                file.WriteLine(LogMsgs.ToString());
            }
            . . .

//in the problematic code, replacing the MessageBox.Show() calls:

    TTBT.LogMsgs.Append("Made it to location 1 in frmOverFunction.GetDuckbillRecord()\r\n");

...而且它确实有帮助 - 在 7 个“代码航路点”中的第一个之后就出现了异常,所以显然在那个特定的丹麦有些东西已经腐烂了。

更新 2

在能够运行应用程序而不会在某处崩溃的罕见经验之后,我意识到我还需要在主窗体的 OnClosing() 事件中编写文件代码——在全局异常处理程序中已经工作了一段时间——我没想到我猜,该应用程序的干净终止将再次发生。

4

1 回答 1

3

我强烈建议您不要用于MessageBox.Show(...)记录/跟踪/调试错误,因为弹出对话框会引入许多细微的错误以及行为、焦点等方面的变化,尤其是当您的 UI 流/状态很重要时。

相反,System.Diagnostics.Trace用于编写跟踪代码(您可以选择将其编译到生产/发布代码System.Diagnostics.Debug中)或编写在构建发布版本时被删除的调试消息。

例如:

public void DoSomething(int a, int b)
{
    Trace.TraceInformation("Starting to do something: a = {0}, b = {1}",
        a, b);

    try 
    {
        int c = a / b;
    }
    catch (DivideByZeroException e)
    {
        Debug.WriteLine("OH NO ... 'b' WAS ZERO!!!! RUN AWAY!!!!");
        throw e;
    }

    Trace.TraceInformation("Done doing something");
}

在上面的示例中,调试输出将在调试版本中可用,但将在发布版本中删除。跟踪输出将在调试和零售错误中可用(除非您关闭 TRACE 构建参数)但不会引入可测量的性能影响,除非您连接侦听器并开始将跟踪输出写入慢速介质,如旋转磁盘、自动收报机打印机, ETC。 ;)

当您在 Visual Studio 中使用 Trace 和/或使用调试消息运行代码时,这些消息将写入“输出”窗格,以便您可以在应用运行时观察应用内部发生的情况。

如果您愿意,您还可以编写一个独立的跟踪侦听器来侦听跟踪和/或调试消息并将它们记录到文件/数据库中或在控制台窗口中显示它们(或 GUI,如果您想花哨的话)。

您还可以使用log4net之类的工具,它使您能够将日志/跟踪消息写入各种文件格式、数据库等。

于 2013-03-26T19:11:42.447 回答