异常处理和用户友好消息

时间:2009-07-23 01:27:25

标签: winforms exception-handling

我正在开发一个winforms应用程序,我想知道什么是异常处理的最佳实践。每当发生异常时,我都会打开一个异常对话框,显示必要的信息,即消息和堆栈跟踪。我遇到的主要困惑是,我希望用户只看到友好的消息,但同时确保开发人员可以获得调试所需的数据。这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:2)

我个人没有使用它,但Red Gate's Exception Hunter看起来像一个非常酷的工具。您最好的选择可能是将错误记录到磁盘上,以便在有人需要查看它时可以使用它,但不会弹出用户的方式。如果需要,您可以打开一个窗口,要求用户通过您的网站向您提交异常信息和堆栈跟踪(只需单击“确定”)。避免发送私人信息,这可能意味着不发送参数值。

编辑:哦,避免说“异常和堆栈跟踪”。说“发生错误,但在您的帮助下我们可以更快地修复它。您是否要在此时自动将错误信息发送到____?请注意,错误报告不会传输任何个人信息。您可以点击”详细信息'以显示报告的完整信息。“如果他们单击详细信息,请垂直展开窗口以显示包含数据的只读文本框。

答案 1 :(得分:0)

catch (Exception ex)
{
    cApp.DB.LogException(ex);
    Messagebox.Show(...);
}

cApp.DB.LogException(ex)记录到数据库表,除非数据库已关闭,然后将其添加到文本文件中。

答案 2 :(得分:0)

我在WinForms中编写的实用程序中使用了一个实用程序方法。稍微小心一点,它可能在生产WinForms应用程序中很有用(让专家不要饶恕他们的批评):

方便超载:

private void PerformUIAction(Action action)
{
    PerformUIAction(action, (string) null);
}

private void PerformUIAction(Action action, string message)
{
    PerformUIAction(action, () => message);
}

真正的一个:

private void PerformUIAction(Action action, Func<string> messageHandler)
{
    var saveCursor = Cursor;
    Cursor = Cursors.WaitCursor;
    try
    {
        action();
    }
    catch (Exception ex)
    {
        MessageBox.Show(
            messageHandler() ?? ex.Message,
            "Exception!",
            MessageBoxButtons.OK,
            MessageBoxIcon.Error,
            MessageBoxDefaultButton.Button1,
            MessageBoxOptions.DefaultDesktopOnly);
        // Replace with logging code. The important part is ex.ToString(),
        // not ex.Message
        Debug.WriteLine(ex.ToString(), "Exception");
        throw;
    }
    finally
    {
        Cursor = saveCursor;
    }
}

使用示例:

private void _samplesMenu_AfterSelect(object sender, TreeViewEventArgs e)
{
    PerformUIAction(
        delegate
            {
                // Do the real work of the event in here.
                // You can reference sender and e
            },
        delegate
            {
                return string.Format(
                    "Error while processing action {1} for node {0}", 
                    e.Node.FullPath, e.Action);
            });
}

答案 3 :(得分:0)

感谢您的回答...我想在一些日志文件中转储堆栈并显示用户友好的消息将在我的情况下工作:)