Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

e.printStackTrace() #3

Open
Miha-x64 opened this issue Oct 19, 2016 · 2 comments
Open

e.printStackTrace() #3

Miha-x64 opened this issue Oct 19, 2016 · 2 comments

Comments

@Miha-x64
Copy link

Добрый день. Читал Хабр, пришёл отсюда: https://habrahabr.ru/post/281226/#comment_8857017
За неимением права комментировать на Хабре, отвечу тут.

Возьмём для примера такой метод:

Object getObject() {
    try {
        return getObjectSomewhere(); // 1
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

Попытка использовать этот метод:

Toast.makeText(getActivity(), getObject().toString(), Toast.LENGTH_SHORT).show(); // 2
                                        ^ NullPointerException

Проблема здесь в том, что вместо того чтобы повалиться прямо при возникновении проблемы, в точке "1", падение будет отложено до точки "2". Бывают гораздо более жёсткие и запутанные ситуации, когда падение надолго откладывается, ошибки проникают в базы данных, живут в продакшене и т. д..

В Java принято действовать строго, именно поэтому есть, например, метод Objects.requireNonNull().

Рекомендую книгу Effective Java автора Joshua Bloch, в частности главу про исключения, Item 65.

@Scogun
Copy link
Contributor

Scogun commented Oct 21, 2016

Добрый день!

Вы имеете в виду, ошибка в том, что я не кидаю исключение дальше? То есть так:

try {
  OrmFactory.SetHelper(DataBaseHelper.class, getApplicationContext());
} catch (Exception e) {
  e.printStackTrace();
  throw e;
}

@Miha-x64
Copy link
Author

Miha-x64 commented Oct 21, 2016

Если вы не можете восстановиться после исключения, вообще не нужно его ловить.
Если это проверяемое (checked) исключение, но вы считаете, что клиент вашей библиотеки не сможет восстановиться при его возникновении, можно обернуть его в непроверяемое (unchecked), например:

catch (SqlException e) {
    throw new RuntimeException(e);
}

catch (Exception — это вообще табу: будут проигнорированы любые исключения, в т. ч., например, NullPointerException, которое означает не сбой системы, после которого можно восстановиться, а ошибку программирования.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants