2

私は行を持っています: string[] cPathDirectories = Directory.GetDirectories(Properties.Settings.Default.customerFolderDirectory);

ユーザーが検索パスを指定しなかった場合、「パスは合法的な形式ではありません」というエラーがスローされます (この設定は、この時点で String.Empty として保存されます)。代わりに、このエラーをスローして、「おバカさん、アプリケーション設定に入って有効なパスを指定してください」と言いたいと思います。代わりにこれを行う方法はありますか:

...catch (SystemException ex)
{
   if(ex.Message == "Path is not of legal form.")
      {
          MessageBox.Show("Hey you idiot, go into the application settings and specify a valid path","Error");
      }
      else
      {
          MessageBox.Show(ex.Message,"Error");
      }
}
4

5 に答える 5

3

いいえ、例外の種類を確認し、明示的にキャッチする必要があります。フレームワークのバージョンによって変更される可能性があるため、例外メッセージ内の文字列をテストすることはお勧めできません。Microsoft は、メッセージが決して変更されないことを保証していないと確信しています。

この場合、ドキュメントArgumentNullExceptionを見ると、またはのいずれかを取得している可能性があるArgumentExceptionため、try/catch ブロックでそれをテストする必要があります。

try {
    DoSomething();
}
catch (ArgumentNullException) {
    // Insult the user
}
catch (ArgumentException) {
    // Insult the user more
}
catch (Exception) {
    // Something else
}

ここでどの例外が必要か、私にはわかりません。それを判断し、それに応じて SEH ブロックを構成する必要があります。ただし、例外のプロパティではなく、常に例外をキャッチするようにしてください。

最後catchを強くお勧めします。他の何かが発生した場合に、未処理の例外が発生しないようにします。

于 2012-08-22T23:58:08.513 に答える
0

引数の例外をチェックするかもしれません

...catch (SystemException ex)
{
   if(ex is ArgumentException)
      {
          MessageBox.Show("Hey you idiot, go into the application settings and specify a valid path","Error");
      }
      else
      {
          MessageBox.Show(ex.Message,"Error");
      }
}
于 2012-08-22T23:54:56.177 に答える
0

それはArgumentException

catch (ArgumentException) {
    MessageBox.Show("Please enter a path in settings");
} catch (Exception ex) {
    MessageBox.Show("An error occurred.\r\n" + ex.Message);
}
于 2012-08-22T23:55:59.297 に答える
0

いくつかの方法があります。

まず、GetDirectories()電話をかける前に設定を確認してください。

if(string.IsNullOrEmpty(Properties.Settings.Default.customerFolderDirectory))
{
    MessageBox.Show("Fix your settings!");
} 
else 
{
    string[] cPathDirectories = Directory.GetDirectories(Properties.Settings.Default.customerFolderDirectory);
}

または、より具体的な例外をキャッチします。

catch (ArgumentException ex)
{
    MessageBox.Show("Hey you idiot, go into the application settings and specify a valid path","Error");
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

そうすれば、例外のスローに対して(マイナーではありますが)ペナルティが発生せず、パスが存在するかどうかの確認など、必要な他の検証を実行できるため、おそらく前者を使用します。

Directory.GetDirectories()ただし、後者を好む場合は、スローされる例外のリストをここで見つけることができるため、メッセージを適切に調整できます。

PS また、私はあなたのユーザーをバカとは呼びませんが、それはあなたとあなたの神の間です。:)

于 2012-08-22T23:56:13.483 に答える
-1

はい、catch ブロックから再び例外をスローできます。例:

catch (SystemException ex)
{
      if(ex.Message == "Path is not of legal form.")
      {
          throw new Exception("Hey you idiot, go into the application settings and specify a valid path", ex);
      }
      else
      {
          MessageBox.Show(ex.Message,"Error");
      }
}
于 2012-08-22T23:53:25.627 に答える