如何获得一个方法来抛出我创建的自定义异常?

时间:2013-12-05 15:45:19

标签: java exception

所以我的自定义异常是PatternFormatException,并且我已经将throws PatternFormatException附加到我的方法的末尾,但是我想知道我是如何实际获得物理抛出它的方法的?我使用if statements吗?即

  if //[doesn't_parse] throw PatternFormatException 

对于许多不同的代码行来说,这似乎很麻烦?我可以捕获一个更普遍的构建异常,即NumberFormatException,然后在处理这个异常时,抛出我自己的异常吗?

2 个答案:

答案 0 :(得分:5)

使用throw关键字抛出异常:

throw new PatternFormatException(...);

通常,您希望尽早捕获异常并正确处理它们。如果您希望您的解析器(或您正在编写的任何程序)生成有意义的错误,通常最好包装任何捕获的异常并重新抛出它,嵌入更有意义的异常中,让用户更好地了解事物的方式出了问题。

这样的事情:

try {
  doSomething();  // throws SomeException
  doSomethingElse();  // throws SomeOtherException
}
catch (Exception e) {
  throw new PatternFormatException(..., e);
}
如果您确切知道可能发生的异常以及PatternFormatException是否正确封装了所有异常,那么

通常很好。但是,Java中的Exceptions的关键思想是,您始终了解可能发生的所有可能的异常。这就是为什么Java会强制您将所有可能抛出的异常(RuntimeException除外)添加到方法声明中。

更安全的设计是:

try {
  doSomething();  // throws SomeException
  doSomethingElse();  // throws SomeOtherException
}
catch (SomeException e) {
  throw new PatternFormatException(..., e);
}
catch (SomeOtherException e2) {
  throw new PatternFormatException(..., e2);
}
catch (Exception e3) {
  throw new UnexpectedPatternFormatException(..., e3);
}

请注意,前两个catch调用不同的构造函数,因此可以不同地处理不同的异常。最后一个catch包装了一个意外的异常,因为您的程序遇到了一个您没有计划的异常(可能是RuntimeException)。如果用户然后抱怨UnexpectedPatternFormatException,您可以回到代码并修复代码,以便不再抛出基础异常或以更有意义的方式包装。您也可以使用单个UnexpectedMySomethingException类作为所有try / catch块的后备,以使事情变得更简单。

关于异常引起的问题应该说的最后一句话:尽管Java使用Exceptions来处理各种情况,甚至是那些基本上不受Java程序员控制的情况(例如访问文件甚至尝试解析时)字符串作为数字),始终要注意抛出和捕获异常实际上是非常昂贵的,这就是为什么许多人倾向于避免这种情况。如果性能不是问题(当异常是罕见的事件时),那么才真正使用例外。

此外,如果抛出异常并捕获它太晚,异常可能会威胁程序状态的完整性,因此应该执行的行不会被执行(例如清理资源的代码或其他需要的代码保持程序状态“正确”),因此,唯一安全的做法是关闭程序。

答案 1 :(得分:3)

如果我理解你的问题,你可以这样做:

If(somethingBad){
  throw new PatternFormatException();
}

如下面的回复中所述。如果你要一遍又一遍地检查这个异常,你可能需要一些静态方法/类方法(使用你的编程大脑)。例如,您可以执行以下操作:

void checkForException(String pattern, String check){
    If(!check.equals(pattern)){
      throw new PatternFormatException();
    }
}

现在你所要做的就是:

try{
    checkForException("abc","123");
}catch(PatternFormatException pfe){
   System.out.println(pfe);  //Whatever you want to happen if the exception is thrown
}

请记住,只能在异常情况下使用例外......

阅读for more information on exceptions。我发现我旁边从不使用例外。