Обработка нескольких исключений
От: Аноним  
Дата: 25.12.07 09:11
Оценка:
Вот кусок кода:
try {
conn = DriverManager.getConnection(str);
}
catch (java.net.SocketException ex) {
System.out.println("Exception: " + ex.getMessage());
return -1;
}

catch (SQLException ex) {
System.out.println("Exception: " + ex.getMessage());
return -1;
}

Пытаюсь подключиться к БД. Функция getConnection (по всплывающей подсказке узнал) вызывает исключение SQLException. Пытаясь обратиться к несуществующему хосту получаю java.net.SocketException(который не наследуется от SQLException!). После этого вставил обработчик этого исключения.
НО, обработать это исключение мне не удается поскольку компилятор ругается, что это исключение никогда не будет возбуждено. Что делать, как быть? Никто с похожим не сталкивался?
Re: Обработка нескольких исключений
От: denis.zhdanov Россия http://denis-zhdanov.blogspot.com/
Дата: 25.12.07 09:20
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Вот кусок кода:

А>...

А>Пытаюсь подключиться к БД. Функция getConnection (по всплывающей подсказке узнал) вызывает исключение SQLException. Пытаясь обратиться к несуществующему хосту получаю java.net.SocketException(который не наследуется от SQLException!). После этого вставил обработчик этого исключения.


Вываливаться тебе должен все равно SQLException, SocketException может быть у него причиной (getCause()). Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.


А>НО, обработать это исключение мне не удается поскольку компилятор ругается, что это исключение никогда не будет возбуждено. Что делать, как быть? Никто с похожим не сталкивался?


И совершенно правильно ругается.
http://denis-zhdanov.blogspot.com
Re[2]: Обработка нескольких исключений
От: Аноним  
Дата: 25.12.07 10:16
Оценка:
Здравствуйте, denis.zhdanov, Вы писали:

DZ>Здравствуйте, Аноним, Вы писали:


Спасибо, помогли разобраться с проблемой.
Re[2]: Обработка нескольких исключений
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 25.12.07 11:19
Оценка:
DZ>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.
Поделитесь секретом, как?
http://jvmmemory.com — простой способ настройки JVM
Re[3]: Обработка нескольких исключений
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 25.12.07 11:33
Оценка: 8 (3)
Здравствуйте, LeonidV, Вы писали:

DZ>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.

LV>Поделитесь секретом, как?

import java.net.SocketException;

public class Test {
  Test() throws SocketException {
    throw new SocketException();
  }


  static void throwsUnthrowableCheckedException() {
    try {
      Test.class.newInstance();
    }
    catch (InstantiationException e) {
      System.err.println("InstantiationException");
      e.printStackTrace();
    }
    catch (IllegalAccessException e) {
      System.err.println("IllegalAccessException");
      e.printStackTrace();
    }
  }


  public static void main(String[] args) {
    try {
      throwsUnthrowableCheckedException();
    } catch (Exception e) {
      System.err.println("Checked unthrowable exception");
      e.printStackTrace();
    }
  }
}


Выводит:
Checked unthrowable exception
java.net.SocketException
    at Test.<init>(Test.java:5)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
    at java.lang.Class.newInstance0(Class.java:350)
    at java.lang.Class.newInstance(Class.java:303)
    at Test.throwsUnthrowableCheckedException(Test.java:11)
    at Test.main(Test.java:26)
Я ненавижу Hibernate!
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Обработка нескольких исключений
От: Blazkowicz Россия  
Дата: 25.12.07 12:26
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

DZ>>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.

LV>>Поделитесь секретом, как?

ANS>
ANS>  Test() throws SocketException {
ANS>    throw new SocketException();
ANS>  }
ANS>      Test.class.newInstance();
ANS>


Это не совсем то. Эта такая фича метода Class.newInstance(), который перехватывает InvocationTargetException и прокидывает истинное исключение:

        // Run constructor
        try {
            return tmpConstructor.newInstance(null);
        } catch (InvocationTargetException e) {
            Unsafe.getUnsafe().throwException(e.getTargetException());
            // Not reached
            return null;
        }
Re[3]: Обработка нескольких исключений
От: Blazkowicz Россия  
Дата: 25.12.07 12:31
Оценка:
Здравствуйте, LeonidV, Вы писали:

DZ>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.

LV>Поделитесь секретом, как?

Делается два класса.

class B
{
   static void method(){};
}

class A
{
   public static void main(String[] args)
   {
        B.method();
   }
}


Компилируются. Потом класс B меняется на.

class B
{
   static void method() throws SomeCheckedException
   {
        throw new SomeCheckedException();
   }
}


И компилируется отдельно и независимо. В результате оба класса функционируют нормально. Но при этом Checked исключение никем не ловится.
Re[5]: Обработка нескольких исключений
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 25.12.07 12:33
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Это не совсем то. Эта такая фича метода Class.newInstance(), который перехватывает InvocationTargetException и прокидывает истинное исключение:


То то. В конечном итоге оно вылетело из метода, в котором не объявлено. А newInstance используется относительно часто.
Я ненавижу Hibernate!
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Обработка нескольких исключений
От: denis.zhdanov Россия http://denis-zhdanov.blogspot.com/
Дата: 25.12.07 12:37
Оценка: 13 (2)
Здравствуйте, LeonidV, Вы писали:

DZ>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.

LV>Поделитесь секретом, как?


Java Puzzlers
Автор(ы): Joshua Bloch, Neal Gafter
How well do you really know Java? Are you a code sleuth? Have you ever spent days chasing a bug caused by a trap or pitfall in Java or its libraries? Do you like brainteasers? Then this is the book for you!
, puzzle 43:

In JDK 1.2, Thread.stop, Thread.suspend, and a few other thread-related methods were deprecated because they are unsafe [ThreadStop]. The following method demonstrates one of the horrible things you could do with Thread.stop:

// Don't do this - circumvents exception checking!

public static void sneakyThrow(Throwable t) {

    Thread.currentThread().stop(t); // Deprecated!!

}


This nasty little method does exactly what the tHRow statement does, except that it bypasses all exception checking by the compiler. You can (sneakily) throw any exception, checked or otherwise, from any point in your code, and the compiler won't bat an eyelash.


Второй пример как раз с Class.newInstance();

Третий через дженерики:

class TigerThrower<T extends Throwable> {

    public static void sneakyThrow(Throwable t) {

        new TigerThrower<Error>().sneakyThrow2(t);

    }



    private void sneakyThrow2(Throwable t) throws T {

        throw (T) t;

    }

}
http://denis-zhdanov.blogspot.com
Re[6]: Обработка нескольких исключений
От: Blazkowicz Россия  
Дата: 25.12.07 13:00
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

Тогда туда же:

import java.net.SocketException;
import sun.misc.Unsafe;
import java.lang.*;
import java.lang.reflect.*;

public class Test {

        public static Unsafe unsafe;
    private static long fieldOffset;

    private Object obj;
    
    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);
    
            unsafe = (Unsafe)f.get(null);
            fieldOffset = unsafe.objectFieldOffset(Test.class.getDeclaredField("obj"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    };


  public static void main(String[] args) {
        unsafe.throwException(new SocketException());
  }
}
Re[7]: Обработка нескольких исключений
От: Blazkowicz Россия  
Дата: 26.12.07 13:33
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

Кстати сам Unsafe делает проброс нативным кодом:
UNSAFE_ENTRY(void, Unsafe_ThrowException(JNIEnv *env, jobject unsafe, jthrowable thr))
  UnsafeWrapper("Unsafe_ThrowException");
  {
    ThreadToNativeFromVM ttnfv(thread);
    env->Throw(thr);
  }
UNSAFE_END
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.