我已经在谷歌上搜索了一段时间,但我仍然不知道在哪种情况下使用哪个例外。我读到在您自己的代码中提出SystemExceptions
是一种不好的做法,因为这些异常最好由 CLR 引发。
但是,现在我想知道在不同情况下我应该提出什么Exeption
。假设我有一个方法,它被调用一个枚举作为参数。这不是一个很好的例子 - 它只是从我的头顶上下来的。
public enum CommandAppearance
{
Button,
Menu,
NotSpecified
}
//...
public void PlaceButtons(CommandAppearance commandAppearance)
{
switch(commandAppearance)
{
case CommandAppearance.Button:
// do the placing
case CommandAppearance.Menu:
// do the placing
case CommandAppearance.NotSpecified:
throw ArgumentOutOfRangeException("The button must have a defined appearance!")
}
}
这里会是什么?是否有某种网站,我可以在其中获得概述?是否有任何模式可以告诉您要引发哪种异常?我只需要一些关于这个主题的提示,因为我对此很不自信。
我认为只养new Exception()
也不是好的做法,是吗?
我敢肯定ArgumentOutOfRangeException
是最好的内置例外。ReSharper也建议这样做。
如果你需要另一个..那么唯一的方法是创建新的特殊例外CommandAppearanceIsNotSpecifiedException
。
对于您的示例场景,我建议:
-
ArgumentOutOfRangeException
该方法是否支持枚举中的所有值,并且传递了无效值。 -
NotSupportedException
该方法是否支持枚举中的值子集。
一般来说,您希望使用异常类型 尽可能在 .net 框架中查看此异常列表,这是有意义的,否则您需要引入自己的异常。这可能涉及为应用程序添加通用应用程序异常,并添加从它继承的更具体的异常。
例如
public class MyAppException : Exception
{
// This would be used if none of the .net exceptions are appropriate and it is a
// generic application error which can't be handled differently to any other
// application error.
}
public class CustomerStatusInvalidException : MyAppException
{
// This would be thrown if the customer status is invalid, it allows the calling
// code to catch this exception specifically and handle it differently to other
// exceptions, alternatively it would also be caught by (catch MyAppException) if
// there is no (catch CustomerStatusInvalidException).
}