Рубрики
Без рубрики

[PT-BR] Будьте исключением! Советы, чтобы освоить исключения в своем коде Java

Эта статья была база, в лекции, которую я описал в 1-ом. SouJava Lightning Talks то оставайтесь a… С тегами java, бразильские разработчики, новички.

Эта статья была база, в лекции, которую я описал в 1-ом. SouJava Lightning Talks затем вы можете проверить, хорошо?!

Вы когда-нибудь задумывались,:

  • Как я должен создать исключения для моей мои бизнес-правила?
  • Будет, что не я создаю исключения слишком много?
  • В отношении исключений das regras de negócios que estoy comiendo: исключение из правил для расширителя времени выполнения?
  • И как справиться с обработкой исключений:
  • И сообщение об ошибке, будучи я конечно в них?
  • я, зайдя на сайт подходящего способа захвата исключений в моих кодах?
  • Будет, что я “трудный” исключение образом ошибочной?
  • Будет я развиваю мои коды “, ориентированные на “исключения”?

Это обычный Java-разработчиков в устранении этих проблем, когда существует необходимость в разработке или обрабатывать исключения в своем коде.

Одни имеют дело с исключениями, как “ошибка” приложения, другие “альтернативных путей” бизнес-правил в вопросе и так далее. Это что-то интересное, и часто толкование.

Есть разработчики, которые используют формы, что язык “сила” обработка исключений, чтобы достичь своей цели, и я думаю, что все они правильно в соответствии с каждым контекстом цели.

Несколько месяцев назад меня интересные дискуссии с другими разработчиками и, в частности, с сообществом SouJava по этому вопросу. Я хочу поздравить всех прекрасное дискуссии (Вы крутые парни!!!) .

Но одна вещь, которую мы должны признать: это может не показаться, но исключения-это важные части, чтобы понять, сценарии “исключительных” “росток” во время разработки и выполнения наших кодов.

Давайте рассмотрим некоторые из этих советов, которые могут помочь нам моделировать и обрабатывать исключения в наших кодов Java.

Не знать иерархию классов исключений Java

Это вопрос, который может испортить и очень моделированием код. Olhando a hierarquia des classes de exceçoes делает Java podemos перепроверять, как классы em vermelho sao, как рассматривают das Проверенные исключения e, как amarelas sao, как Непроверенное исключение .

Não saber a различия в проверенных исключениях e Непроверенные исключения e quando сша-лас

Checked Exceptions исключения, которые должны быть использованы для устранимые ошибки или их требований бизнес-правила, важным . Как правило исключений для вашего домена входят в эту категорию. Компилятор языка заставит ее лечение всегда что метод, который декларативно запуска вызывается .

Уже Unchecked Exceptions должны быть использована когда-то случае “исключительных” является необратимым, или безвозвратные . В принципе, мы не должны поймать эти типы исключений. Как правило, используют- “Обработчиков исключений” для этой цели, которые, как правило, – это уведомить пользователя правила, что что-то произошло, и нет ничего, что сделать, чтобы этой ситуации.

Захватить все исключения, как Исключение

Ты что создать мои исключения, будем использовать что есть!

Хорошо, захватить любое исключение или все… хе-хе), как Исключение, могут быть проблемы. То же самое происходит на стороне тех, кто пишете метод, который запускает только исключения типа Exception.

try{
    debitAccount.transferTo(creditAccount,amount);
}catch(Exception ex){
    // Ok, mas o que aconteceu?
    // Teremos que checar a mensagem, e torcer para que ela seja útil
    // E talvez analisar a stacktrace
}

В приведенном выше коде, использовать только класс Исключений, идентификации является потерпевшей, то если сообщение об ошибке не помогает, анализ stacktrace будет одним из уникальных точек для его идентификации .

Класс Exception является checked exception, так создайте их исключения из него для сценариев хотите, чтобы компилятор принудительно лечение то же самое. Не забудьте создать свои исключения проверяется для случаев, которые должны и которые действительно имеют смысл в соответствии с домена .

Создать многочисленные исключения, так беспорядочно

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

Представьте, что в системе передачи значений между счетами, где создали исключение для каждого сценария:

try{
    debitAccount.transferTo(creditAccount,amount);
}catch(InvalidAmountException ex){
    // quantia inválida, e agora?
}catch(ExceededAmountException ex){
    // quantia excedida, e agora?
}catch(BalanceNotAvailableException ex){
    // saldo não disponível, e agora?
}catch(DisabledCreditAccountException ex){
    // conta à creditar está desativada, e agora?
}catch(DisabledDebitAccountException ex){
    // conta à debitar está desativada, e agora?
}catch(BlockedCreditAccountException ex){
    // conta à creditar está bloqueada, e agora?
}catch(BlockedDebitAccountException ex){
    // conta à debitar está bloqueada e agora?
}catch(BusinessException ex){
    // alguma outra coisa aconteceu, e agora?
}

И если мы это другой синтаксис:

try{
    debitAccount.transferTo(creditAccount,amount);
}catch(InvalidAmountException 
            | ExceededAmountException 
            | BalanceNotAvailableException 
            | DisabledCreditAccountException 
            | DisabledDebitAccountException
            | BlockedCreditAccountException 
            | BlockedDebitAccountException 
            | BusinessException ex){
    // quantia inválida ou
    // quantia excedida ou
    // saldo não disponível ou
    // conta à creditar está desativada ou
    // conta à debitar está desativada ou
    // conta à creditar está bloqueada ou
    // conta à debitar está bloqueada ou
    // alguma outra coisa aconteceu, e agora?
}

Ничего приятного, не так ли?

Что такое сокращение наш список исключений:

Так будет более кратким их лечение:

try{
    debitAccount.transferTo(creditAccount,amount);
}catch(BalanceNotAvailableException ex){
    // saldo não disponível, e agora?
}catch(DeactivatedAccountException ex){
    // uma ou ambas estão desativadas, e agora?
}catch(BlockedAccountException ex){
    // uma ou ambas estão bloqueadas, e agora?
}

Конечно, не существует “серебряная пуля” . Необходимо использовать сообщений, а также четкие, чтобы предоставить достаточно контекста, чтобы определить, не произошло. Em nossa exemplo, mensagens clarus serao necessarias, особенно в качестве исключения Деактивировано исключение учетной записи e Заблокировано исключение учетной записи. Оба не ясно, если debitAccount или creditAccount или оба причинили сценарий в вопросе.

Не использовать четкие сообщения в исключения

Я считаю, что это единодушное этот совет: всегда используйте четкие сообщения в свои исключения. Это поможет скорее найти и понять ошибки. Как правило, используется один файл свойств для хранения этих ошибок, обеспечивая тем самым, возможно, способ отображения сообщения на уровне презентации путь интернационализации.

Выключение исключения

Другой подход очень ошибочное и очень часто происходит это в обработке исключений, которые абонент “считают ненужным” выполнять лечение, просто игнорируя тот факт возникновения выпуска исключения.

Например, вы, может быть, видели что-то подобное:

Connection  connection = null;
try{
        connection = datasource.getConnection();
        // executando uma regra incrível aqui
}catch(SQLException exception){
        handleSQLException(exception);
}finally{
    if( connection != null){
        try{
            connection.close();
        }catch(SQLException ex){}
    }
}

Не завершить/закрыть открытые ресурсы в контексте того, что произошло исключение

Одним из факторов общем, в java-приложений, это не правильно закрыты ресурсов, таких как соединения с базой данных, ленту или любой другой компонент, который имеет потребности, которые будут закрыты после завершения блока кода, который они были открыты или созданы. Блокнот finally для закрыть возможности или необходимых компонентов.

Так что не делайте этого:

Connection  connection = null;
try{
        connection = datasource.getConnection();
        // executando uma regra incrível aqui
}catch(SQLException exception){
        handleSQLException(exception);
}

Мой совет сделать что-то подобное:

Connection  connection = null;
try{
        connection = datasource.getConnection();
        // executando uma regra incrível aqui
}catch(SQLException exception){
        handleSQLException(exception);
}finally{
    if( connection != null){
        try{
            connection.close();
        }catch(SQLException ex){
            throw new IllegalStateException("algo grave aconteceu ao fechar a conexão",ex);
        }
    }
}

Для того, чтобы помочь справиться с этой проблемой, начиная с Java 7 была добавлена попробуйте с ресурсами инструкции, onde é возможное использование quando precisamos trabalhar com qualquer gato для реализации интерфейса java.lang. AutoCloseable , который включает в себя все объекты, которые реализуют java.io. Closeable :

try(Connection  connection = datasource.getConnection()){
        // executando uma regra incrível aqui
}catch(SQLException exception){
        handleSQLException(exception);
}

Таким образом, компоненты и открытых ресурсов в try() будут закрыты при завершении блока.

Примечание: Оператор try-with-resources, возможно, блоки catch и finally, точно так же, как оператор try общего. В инструкции try-with-resources, любой catch или finally выполняется после того, как все ресурсы объявлены закрыты.

Выключение исключения

Другой подход очень ошибочное и очень часто происходит это в обработке исключений, которые абонент “считают ненужным” выполнять лечение, просто игнорируя тот факт возникновения выпуска исключения.

Но не заблуждается, возможно применение вступил в несогласованном состоянии, и это никто не хочет, не так ли?

Другой пример:

try{
        CurrencyUnit usd = Monetary.getCurrency("USD");
        Money coffee = Money.of(5, usd);

        Account maxAccount = bank.getAccount(123);
        Account otavioAccount = bank.getAccount(333);

        maxAccount
            .transferTo(otavioAccount)
            .amount(coffee)
            .commit();

}catch(BalanceNotAvailableException exception){
        // É impossível saber o que aconteceu aqui sem realizar um debug! 
}

Невозможно знать, что здесь произошло без проведения отладки! (Хорошо, Цезарь, к сожалению, будет знать… ☹️ ).

Поэтому всегда относитесь или журнала, эти исключения (возможно, на уровне WARN или ERROR).

Пропустить трассировки стека

Кто я такой, чтоб диктовать правила, не так ли? Но давайте посмотрим на примере ниже.

try{
        CurrencyUnit usd = Monetary.getCurrency("USD");
        Money coffee = Money.of(5, usd);

        Account maxAccount = bank.getAccount(123);
        Account otavioAccount = bank.getAccount(333);

        maxAccount
            .transferTo(otavioAccount)
            .amount(coffee)
            .commit();

}catch(BalanceNotAvailableException exception){
        // Assim perderemos a causa raiz da exceção que é: 
    // o Max não vai poder para o café pro Otávio dessa vez!
        throw new ExceededAmountException();
}

Для тех, кто разработал может показаться не важным, но игнорировать причину, будет вызывать дискомфорт для тех, кто будет давать поддержку в случае возникновения исключения.

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

Так мы теряем причину исключения: то, что Макс не смог заплатить за кофе, pro Цезарь на этот раз!

Завершение

Работать с исключениями в Java является вопрос, как спорный и интересный. Есть те, что ненавидят, другие, которые способствуют функции и даже может быть водоразделом, когда пытается познакомиться с другими языками (например, в Golang).

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

Я оставляю ниже некоторые статьи, которые я использовал, являются ссылками большими, чтобы все по теме!

Я надеюсь, что “начала” в его сознании желание исследовать больше об этой теме и так болею, чтобы что вы и впредь “захват” и обучения!

Эта статья была база, в лекции, которую я описал в 1-ом. SouJava Lightning Talks так что не стесняйтесь, чтобы проверить!!!

Оставляйте ваши советы, вопросы и “исключения” , я хочу сказать, что предложения здесь!

Объятия и до свидания!

Характеристика:

Оригинал: “https://dev.to/dearrudam/be-the-exception-dicas-para-dominar-excecoes-em-seus-codigos-java-4nlo”