有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确处理多个异常抛出器对象

我希望在更高的级别上处理异常,而不是在这个方法中,但我希望确保对象a&;b正确关闭

close()方法也可以引发异常

此模板是适合此问题的解决方案还是有更智能/更简单的解决方案

public void foo() throws Exception {
 A a = null;
 B b = null;
 try {
  a = new A();
  b = new B();
  ...
 } catch(Exception e) {
  throw e;
 }
 finally {
  Exception ex = null;
  try {
   if (a != null)
    a.close();
  } catch(Exception x){
    ex = x;
  }
  try {
   if (b != null)
    b.close();
  } catch(Exception x) {
   ex = x;
  }
  if (ex != null)
   throw ex;
 }

共 (4) 个答案

  1. # 1 楼答案

    这个问题的正确解决方案(在C#)是using语句:

    using(A a = new A())
    using(B b = new B())
    {
        //...
    }
    

    这确保了当控件离开块时ab都是Dispose

  2. # 2 楼答案

    A a = null;
    try
    {
      a = new A();
      //do stuff
    }
    finally
    {
      a.Close();
    }
    

    try块不需要catch块,它需要catchfinally块(或两者兼有)

  3. # 3 楼答案

    1. 除了Femaref所说的之外,您还可以创建一个helper方法,使用一个或多个可关闭的对象,并在必要时抛出异常。只是为了减少冗余

    2. 通常希望返回原始错误消息,而不是在close调用期间发生的错误消息。后者可能会直接从前者开始,但你需要前者才能找到问题的真正原因

  4. # 4 楼答案

    我只看到一个小问题:如果a.close()b.close()都失败了,那么a.close()的异常就会丢失,因为您重用了ex

    您可以使用记录器来持久化异常消息——在这种情况下,只在finally块中抛出任何异常就足够了,因为您已将错误消息保存在日志文件中