1. Въведение
В този урок ще разгледаме как да създадем персонализирано изключение в Java .
Ще покажем как дефинираните от потребителя изключения се прилагат и използват както за проверени, така и за непроверени изключения.
2. Необходимостта от персонализирани изключения
Изключенията на Java обхващат почти всички общи изключения, които непременно ще се случат при програмирането.
Понякога обаче трябва да допълним тези стандартни изключения със собствените си.
Основните причини за въвеждане на персонализирани изключения са:
- Изключения от бизнес логиката - Изключения, които са специфични за бизнес логиката и работния процес. Те помагат на потребителите на приложенията или разработчиците да разберат какъв е точният проблем
- За улавяне и предоставяне на специфична обработка на подмножество от съществуващи Java изключения
Изключенията на Java могат да бъдат проверени и отменени. В следващите раздели ще разгледаме и двата случая.
3. Персонализирано проверено изключение
Проверените изключения са изключения, които трябва да бъдат третирани изрично.
Нека разгледаме част от кода, която връща първия ред на файла:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch(FileNotFoundException e) { // Logging, etc }
Кодът по-горе е класически начин за работа с изключения, проверени от Java. Докато кодът изхвърля FileNotFoundException, не е ясно каква е точната причина - дали файлът не съществува или името на файла е невалидно.
За да създадем персонализирано изключение, трябва да разширим класа java.lang.Exception .
Нека да видим пример за това, като създадем изключение по избор, наречено IncorrectFileNameException:
public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } }
Имайте предвид, че ние също трябва да предоставим конструктор, който приема String като съобщение за грешка и се нарича конструктор родителски клас.
Това е всичко, което трябва да направим, за да дефинираме персонализирано изключение.
След това нека видим как можем да използваме персонализираното изключение в нашия пример:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch (FileNotFoundException e) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException("Incorrect filename : " + fileName ); } //... }
Създадохме и използвахме персонализирано изключение, така че потребителят вече може да знае какво точно е изключението. Това достатъчно ли е? Следователно губим първопричината за изключението .
За да коригираме това, можем също да добавим параметър java.lang.Throwable към конструктора. По този начин можем да предадем изключението root на извикването на метода:
public IncorrectFileNameException(String errorMessage, Throwable err) { super(errorMessage, err); }
Сега се използва IncorrectFileNameException заедно с основната причина за изключението по следния начин:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } // ... }
Ето как можем да използваме персонализирани изключения, без да губим първопричината, от която са възникнали .
4. Персонализирано непроверено изключение
В същия пример, нека приемем, че се нуждаем от персонализирано изключение, ако името на файла не съдържа разширение.
В този случай ще ни трябва персонализирано непроверено изключение, подобно на предишното, тъй като тази грешка ще бъде открита само по време на изпълнение.
За да създадем персонализирано непроверено изключение, трябва да разширим класа java.lang.RuntimeException :
public class IncorrectFileExtensionException extends RuntimeException { public IncorrectFileExtensionException(String errorMessage, Throwable err) { super(errorMessage, err); } }
Следователно, можем да използваме това непроверено изключение в нашия пример:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } else { throw new IllegalArgumentException("Non readable file"); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } //... } catch(IllegalArgumentException err) { if(!containsExtension(fileName)) { throw new IncorrectFileExtensionException( "Filename does not contain extension : " + fileName, err); } //... }
5. Заключение
Персонализираните изключения са много полезни, когато трябва да се справим с конкретни изключения, свързани с бизнес логиката. Когато се използват правилно, те могат да служат като полезен инструмент за по-добро обработване на изключения и регистриране.
Кодът за примерите, използвани в тази статия, е достъпен в Github.