簡體   English   中英

對象引用的自定義消息未設置為對象的實例

[英]Custom message for Object reference not set to an instance of an object

你好
我們有一個巨大的Windows應用程序,異常處理不佳。 來自許多地方的應用程序拋出對象引用錯誤,系統錯誤消息顯示給用戶,因為它正在使用消息框。

我正在尋找一個簡單的解決方案,可用於將此消息替換為用戶友好的整個應用程序

謝謝...

@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

if(!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";
    }        
}

在代碼中你可以嘗試使用catch

        try
        {

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

當您捕獲異常並顯示消息框時,您只需在消息框中寫入友好消息。 我不認為顯示異常消息是一個好主意 - 它可以提供有關惡意用戶可以用來攻擊應用程序的應用程序結構的信息。

**額外**

無論哪種方式,這都是一個很大的變化。 您可以在許多地方覆蓋異常,或覆蓋許多地方的錯誤消息顯示。 我可以建議您將錯誤消息的顯示合並到一個地方,這樣當您需要新的錯誤消息時,您還有一個地方可以去,因此將來,如果您需要更改它,可以在一個地方進行更改。

在WinForms應用程序中,您可以使用類似於此處描述的技術來顯示用戶友好的錯誤消息。

也就是說,由於null引用異常的唯一原因是開發人員錯誤,因此應用程序存在很多整體問題。 我建議至少在你將要放置的異常處理程序中放入一個記錄器,這樣就不會忽視錯誤。

您需要捕獲遺留應用程序拋出的異常,並在某些日志文件中記錄該異常,並根據發生的異常顯示相應的用戶友好消息。

例如,您可以只顯示“應用程序無法找到文件xyz”,而不是顯示FileNotFound異常消息以及stacktrace。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM