1

TryMetry catch ブロックを持ち、彼の例外をキャッチするというメソッドがあります。
別のクラスから彼を呼び出しますが、例外が発生してもコードの実行は停止しません。
例:

public void TryMe()
{
    try
    {
        SomeMethod();
    }
    catch(Exception exception){
        MessageBox.Show(exception.Message);
    }
}


     //Method calling
     Actions CAactions = new Actions();
     CActions.TryMe();
     ///////////////////////////////////
     //If exception is handled it should stop to here.

     this.Hide();
     FormActions FormActions = new FormActions();

メソッド定義はクラスファイルにあります。メソッドの呼び出しは、Windows 形式です。
問題は、メッセージ ボックスが表示されるだけで、コードの実行が続行されることです。
例外をキャッチしてフォームを非表示にしないようにした後、コードを停止したい。すべてが問題なければ、非表示にする必要があります。
私の認識が間違っているのではないでしょうか?

4

4 に答える 4

7

最も簡単な解決策は、関数が成功したかどうかに応じて true/false を返すように変更することです (つまり、TryMe メソッドでエラーが発生しなかった場合にのみフォームを非表示にします)。

 public bool TryMe()
 {
  try
   {
    SomeMethod();
    return true;
   }
   catch (Exception exception)
   {
    // log exception 
    return false;
   }
  }

次のように呼び出します。

 if (CActions.TryMe())
 {
   this.Hide();
 }

もう 1 つのオプションは、メッセージを表示した後に例外を再スローし、呼び出し元のコードに try catch で例外を処理させることです。

public void TryMe()
{
 try
 {
   SomeMethod();
  }
   catch (Exception exception)
  {
   // log exception? 
   throw;
  }
  }

呼び出しコード:

   try 
   {
     CActions.TryMe();
     this.Hide();
   }
   catch (Exception ex)
   {
      // error handling
    }
于 2013-05-14T07:05:02.657 に答える
2

MessageBox.Show()アプリケーションの UI 側 (フォームなど) ではなく、どこでも呼び出すことは避けてください。これは悪い習慣と見なされます。だから私はNDJの答えを修正します:

public bool TryMe()
{
   try
   {
       SomeMethod();
       return true;
   }
   catch (Exception exception)
   {
       //insert some logging here, if YOU need the callstack of your exception
       return false;
   }
}

if (CActions.TryMe())
{
    this.Hide();
}
else
{
    MessageBox.Show(...); //insert some meaningful message, useful to END-USER here, not some "Null refrence exception!!11" message, which no one but you will understand
}
于 2013-05-14T07:18:07.597 に答える
2

別のオプションは、制御フローを呼び出し元に委譲することです。

public void TryMe()
{
    try
    {
        SomeMethod();
    }
    catch(Exception exception){
       throw;
    }
}

そしてそれを次のように使用します

 Actions CAactions = new Actions();
 try {
    CActions.TryMe();
    //continue, all ok.
 }
 catch(Excepiton ex) {
      //hide a form, exception happens inside a method
 }
于 2013-05-14T07:09:13.090 に答える
1

コードが示すように、Exceptionがキャッチされ、そのMessageプロパティが に渡されますMessageBox。つまり、コードが中断されたり、Exceptionバブルアップする機会が与えられたりすることは決してありません。

補足:MessageBoxクラスの try/catch (またはその他のメソッド) に a を表示することは、やや悪い習慣と考えられています。この理由は明らかです。これにより、クラスがグラフィカル アプリケーション環境で使用されることに依存するようになり、クラスの再利用性に反します。および/またはテキストExceptionを含む文字列など、任意のタイプのアプリケーションが処理できるメソッドの戻り値の型に沿ってを伝播することをお勧めします。MessageInnerException

あなたはそれから例えばすることができます

string methodResult = myObject.MyMethod();
if(String.IsNullOrEmpty(myMethodResult)) //... everything worked out ok
...
else //well then at least you have an error message to work with
于 2013-05-14T07:13:34.090 に答える