Як я можу наздогнати всі винятки, які будуть кинуті через читання та запис файлу?


105

Чи є у Java якийсь спосіб отримати (зловити) все exceptionsзамість того, щоб спіймати виняток окремо?


2
і я спіймаю всі ці конкретні Винятки з уловом (Виняток е) {} ??
Йоганна

так. Оскільки виняток є базовим класом усіх винятків, він буде сприймати будь-який виняток.
jjnguy

1
@ jjnguy: дякую за гарне пояснення.
Йоганна

Я радий, що це було корисно.
jjnguy

Відповіді:


111

Якщо ви хочете, ви можете додати пункти закидання до своїх методів. Тоді вам не доведеться відразу ловити перевірені методи. Таким чином, ви можете зловити exceptionsпізніше (можливо, одночасно з іншими exceptions).

Код виглядає так:

public void someMethode() throws SomeCheckedException {

    //  code

}

Тоді пізніше ви можете розібратися з тим, exceptionsякщо ви не хочете мати справу з ними в цьому методі.

Щоб спіймати всі винятки, який-небудь блок коду може кинути ви можете зробити: (Це також зловить, що Exceptionsви написали самі)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

Причина, яка працює, полягає в тому Exception, що базовий клас для всіх винятків. Таким чином, будь-який виняток, який може бути кинутий, є Exception(верхній регістр 'E').

Якщо ви хочете обробити власні винятки, спочатку просто додайте catchблок перед загальним винятком.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

Хоча я погоджуюся, що це не дуже вдалий стиль для вибору необробленого винятку, існують способи обробки винятків, які передбачають чудову реєстрацію та можливість обробляти несподіване. Оскільки ви перебуваєте у винятковому стані, ви, ймовірно, більше зацікавлені в отриманні хорошої інформації, ніж у час відгуку, тому instanceof продуктивність не повинна бути великим хітом.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Однак це не враховує той факт, що IO також може викидати помилки. Помилки не є винятком. Помилки є меншою ієрархією успадкування, ніж Винятки, хоча обидва поділяють базовий клас Throwable. Оскільки IO може кидати помилки, ви можете зайти так далеко, щоб зловити Throwable

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

12
Чому б не використати кілька блоків лову?
Карл Г

1
Я б заперечував, що ви повинні чітко виловлювати кожен виняток, але в питанні явно було запитано, як зловити все, що кине блок коду.
кодетульху

Цей кидаючий був корисний.
Аншул

Це рішення, яке я шукав, мені потрібен був інший варіант для обробки виключень. Спасибі
CubeJockey

Накидний наконечник дійсно корисний.
cherryhitech

15

Ловіть базовий виняток "Виняток"

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
Якщо ви пишете цей код, ви майже напевно робите щось жахливо неправильне.
Джордж

2
@George Чому ти це сказав?
кучі

10
@George Не обов'язково, якщо ви маєте справу з тим, що має безліч чутливих параметрів входу, і дуже складно перевірити обґрунтованість кожного з них, виводячи всі винятки, коли робочі випадки належним чином перевірені, це шлях. . Це зробить код зрозумілим і набагато менше mindf * k, ніж величезний та потенційно важкий стан.
Johnride

2
Більшість кодерів, з якими я працював, нічого не містять у своїх заявах про вилов, тому використовувати цей фрагмент спробувати лову насправді краще, ніж ловити купу різних типів винятків і нічого не робити з цим
Лу Морда,

1
@LouisMorda Я не погоджуюся: ловити кожен підклас винятків і не робити нічого на їх основі (ігноруючи їх) гірше, ніж лише ловити деякі конкретні винятки та ігнорувати їх. Якщо ви ловите деякі типи винятків і нічого не робите з інформацією, у вас немає шансів дізнатися, що пішло не так у тих ситуаціях, але якщо ви ловите всі підкласи винятків, у вас немає шансів дізнатися, що пішло не так у значній кількості ситуацій. Поміркуйте, як би ви обробляли звіти про помилки без інформації про винятки, як-от стеки та повідомлення.
zpon

6

Лову практику винятків погано - це занадто широко, і ви можете пропустити щось подібне до NullPointerException у власному коді.

Для більшості файлових операцій корінним винятком є IOException . Краще зловити це, замість цього.


1
Це погана практика, щоб зловити виняток. чому? downvote погано пояснив
Pedro Sequeira

4

Так, є.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

4

Ви можете зафіксувати кілька винятків в одному блоці лову.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

Ви маєте на увазі зловити Exceptionбудь-який тип, який кидається, на відміну від конкретних виключень?

Якщо так:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

Що робити для тих, які не є конкретними ??
Йоганна

і я спіймаю всі ці конкретні Винятки з уловом (Виняток е) {} ??
Йоганна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.