对象引用的自定义消息未设置为对象的实例

时间:2010-12-01 09:01:29

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

您好
我们有一个巨大的Windows应用程序,异常处理不佳。来自许多地方的应用程序抛出对象引用错误,系统错误消息显示给用户,因为它正在使用消息框。

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

...谢谢

5 个答案:

答案 0 :(得分:2)

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

Exa_1: -

DataSet ds;

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

DataSet 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
如果

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

如果你想在Exception句柄中显示自定义Message,那么你可以创建自己的Exception Class,它将覆盖Exception类,然后你可以抛出并捕获:

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);
        }

答案 1 :(得分:1)

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

**额外**

无论哪种方式,这都是一个很大的变化。您可以在许多地方覆盖异常,或覆盖许多地方的错误消息显示。我可以建议您将错误消息的显示合并到一个地方,这样当您需要新的错误消息时,您就有了一个地方,因此将来,如果您需要更改它,还需要更改一个地方。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果是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" );
   }
 }