【问题标题】:Custom message for Object reference not set to an instance of an object对象引用的自定义消息未设置为对象的实例
【发布时间】:2011-05-18 09:13:19
【问题描述】:


我们有一个巨大的 Windows 应用程序,异常处理很差。应用程序从很多地方抛出对象引用错误,并且系统错误消息在使用消息框时向用户显示。

我正在寻找一种简单的解决方案,可用于将此消息替换为对整个应用程序用户友好的内容

谢谢...

【问题讨论】:

  • 你有源代码访问权限吗?还是只是二进制文件?
  • yap 源代码是那里.. 但是在警报显示时更改代码将是相当大的变化,因为它在很多地方都有。我正在寻找一种方法来覆盖异常类或其他东西并发送友好消息而不是 Obejct 参考错误消息..
  • 是windows应用还是web应用?

标签: c# vb.net winforms exception-handling


【解决方案1】:

@Anz:在代码中的每个地方都使用异常处理并不好,所以请始终牢记这一点,您必须知道所有不同类型的异常的含义。 在您的场景中,您得到“对象引用异常”,此异常的主要原因是您在访问变量时没有检查 null

Exa_1:-

数据集 ds;

现在如果我将它作为 ds.Table.count() 访问它会给出异常,所以我们应该在这里使用

数据集 ds;

 If(ds!=null)
 {
   int val = ds.Table.count();
 } 

Exa_2:-

     string strVariable=txtInput.Text;

     int number = Convert.Int32(strVariable); // here if txtInput.Text is empty them     it will through exception so here we can use

if(!String.IsNullOrEmpty(strVariable)) int number = Convert.Int32(strVariable);

如果你想在异常句柄中显示自定义消息,那么你可以创建自己的异常类,它将覆盖异常类,然后你可以像这样抛出和捕获:

public class MyException : Exception
{
    public string customMessage;
    public MyException(string sourceName)
    {
        customMessage = sourceName + " can not be null";
    }
    public MyException()
    {
        customMessage="ObjectReferenceException";
    }        
}

在你正在使用的代码中尝试捕获使用

        try
        {

            throw new MyException("check");
        }
        catch (MyException ex)
        {
            MessageBox.Show(ex.customMessage);
        }

【讨论】:

    【解决方案2】:

    当您捕获异常并显示消息框时,您只需在消息框中写入一条友好的消息即可。我不认为显示异常消息是一个好主意 - 它可能会泄露有关恶意用户可能用来攻击应用程序的应用程序结构的信息。

    ** 附加**

    不管怎样,这都是一个很大的变化。您要么在很多地方覆盖异常,要么在很多地方覆盖错误消息的显示。我可以建议您将错误消息的显示合并到一个位置,这样当您需要新的错误消息时,您可以去一个地方,因此将来如果您需要更改它,可以更改一个地方。

    【讨论】:

    • 在应用程序的很多地方都显示错误消息,这将是一个很大的变化。我正在寻找一种方法来覆盖异常类或其他东西并发送友好消息而不是对象参考错误消息。显示器没有安全问题,因为它是在有限用户环境中使用的 Windows 应用程序。
    • 无论如何这都是一个很大的变化。您要么在很多地方覆盖异常,要么在很多地方覆盖错误消息的显示。我是否建议您将错误消息的显示合并到一个位置,以便当您需要新的错误消息时,您可以去一个地方,因此将来如果您需要更改它,可以更改一个地方。
    【解决方案3】:

    在 WinForms 应用程序中,您可以使用类似here 描述的技术来显示用户友好的错误消息。

    也就是说,由于空引用异常的唯一原因是开发人员错误,因此有一种强烈的代码异味,表明应用程序存在很多整体问题。我建议至少在您要放置的异常处理程序中放置一个记录器,这样错误就不会被忽视。

    【讨论】:

      【解决方案4】:

      如果是 Asp.Net 应用程序,则在 global.asax 中使用 Application_Error 事件

       Application_Error
      
       {
         HttpContext context = HttpContext.Current;
      
         Exception ex = context.Server.GetLastError();
        //process your exception
      
          if ( context.IsCustomErrorEnabled )
         {
            context.Server.ClearError();
            context.Server.Transfer( "~/error.aspx" );
         }
       }
      

      【讨论】:

        【解决方案5】:

        您需要捕获遗留应用程序抛出的异常并将该异常记录在某个日志文件中,并根据发生的异常显示适当的用户友好消息。

        例如,您可以只显示“应用程序无法找到文件 xyz”,而不是在堆栈跟踪中显示 FileNotFound 异常消息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多