2013-12-10 3 views
1

У меня есть проект с обработкой исключений, написанный следующим образом:Java: Обработчик исключений

Родительский класс имеет всю логику обработки исключений. И вызываемый класс просто генерирует исключение, а класс invoker обрабатывает соответствующую логику.

Теперь проблема, с которой я столкнулась при вызове класса, открывает разные вещи, например, файл. Эти файлы не закрываются во время исключения.

так что должно быть подходящим способом обработки исключений в этом случае.

class A 
    { 
    private void createAdminClient() 
    { 

     try 
     { 
      B b = new B();   
       b.getClinetHandler(); 
     } 
     catch(CustomException1 e1) 
     { 
     } 
     catch(CustomException2 e1) 
     { 
     } 
     catch(CustomException3 e1) 
     { 
     } 
     catch(CustomException4 e1) 
     { 
     } 
    } 
} 

class B 
{ 
    ................ 
    ................ 

    getClinetHandler() throws Exception 
    { 
     --------------------------  
     ---- open a file---------- 
     -------------------------- 
     ----lines of code--------- 
     --------------------------  

     Exceptions can happen in these lines of code. 
     And closing file may not be called  

     --------------------------  
     ---- close those files---- 
     -------------------------- 

    } 

} 

ответ

2

Вы можете обернуть код, который может вызвать исключение в Try ... наконец блок:

getClientHandler() throws Exception { 
    // Declare things which need to be closed here, setting them to null 
    try { 
     // Open things and do stuff which may throw exception 
    } finally { 
     // If the closable things aren't null close them 
    } 
} 

Таким образом, исключение еще пузыри до обработчика исключений, но, наконец, блок гарантирует, что код закрытия все равно вызывается в случае исключения.

0

использовать блок finally для выполнения окончательных задач. например

try 
    { 
     B b = new B();   
      b.getClinetHandler(); 
    } 
    catch(CustomException1 e1) 
    { 
    } 
    finally{ 
     // close files 
    } 

Из doc

окончательно преградить всегда выполняется, когда попытка блокировать выходы. Это гарантирует, что блок finally будет выполнен, даже если произойдет непредвиденное исключение. Но, наконец, полезно не только для обработки исключений - это позволяет программисту избежать случайного обхода кода очистки путем возврата, продолжения или разрыва. Включение кода очистки в блок finally всегда является хорошей практикой, даже если не ожидается никаких исключений.

0

Это, как я это делаю

try { 
    //What to try 
} catch (Exception e){ 
     //Catch it 
    } finally { 
        //Do finally after you catch exception 
     try { 
      writer.close(); //<--Close file 
     } catch (Exception EX3) {} 
    } 
0

Используйте finally блок для обработки выполнения пост-обработки (удалось независимо от того, он или не удалось). Как так:

// Note: as Sean pointed out, the b variable is not visible to the finally if it 
// is declared within the try block, therefore it will be set up before we enter 
// the block. 
    B b = null; 

    try { 
     b = new B();   
     b.getClinetHandler(); 
    } 
    catch(CustomException1 e1) { 
    } // and other catch blocks as necessary... 
    finally{ 
     if(b != null) 
      b.closeFiles() // close files here 
    } 

finally блок всегда выполняется, несмотря на это, даже если вы throw или return из try или catch блоков.

This answer дает очень хорошее объяснение того, как блок finally работает в этой ситуации, и когда/как он выполняется, и в основном далее иллюстрирует то, что я только что написал.

+1

Это не то, что они хотят. Закрываемые объекты не отображаются в этом кодовом блоке. – Sean

+0

@Sean Я думаю, что это то, что они хотят, поскольку в конечном итоге они спрашивают, как закрыть файлы после выполнения (в методе 'getClientHandler'). Однако вы действительно указали на недостаток, поскольку переменная 'b' не видна, что я исправлю. –

+0

Привет, Teeg, фрагмент кода, который я вставил, в основном родительский класс имеет всю логику обработки исключений. Если я выберу этот путь, в этом случае closeFiles и другая обработка логики обработки закрываемых объектов должны перейти к родительскому объекту, которого я не хочу. – Exploring

Смежные вопросы