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

不,您需要检查异常的类型并明确捕获。测试异常消息中的字符串不是一个好主意,因为它们可能会从一个版本的框架更改为另一个版本。我很确定微软不保证消息永远不会改变。

在这种情况下,查看文档可能会得到 aArgumentNullExceptionArgumentException,因此您需要在 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 回答