Исключения всегда должны быть публичными - PullRequest
4 голосов
/ 01 августа 2011

Я знаю, что это хорошая вещь, всегда делать сериализуемые исключения .Но я должен также всегда делать их публичными?Даже если они должны быть пойманы только внутри?Интересно, могут ли быть какие-либо проблемы с безопасностью или сериализацией (например, сортировка по доменам приложений), если исключения не являются публичными

Ответы [ 4 ]

4 голосов
/ 01 августа 2011

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

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

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

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

4 голосов
/ 01 августа 2011

Да, они должны .

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

0 голосов
/ 01 августа 2011

Подумайте об этом ... Насколько далеко может зайти цепь? Если исключение будет вызвано из функции public , тогда оно должно быть само public.

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

В идеале, у меня был бы такой сценарий:

namespace MyAPI
{
    public class PublicException : System.Exception
    {
    }

    // derive my public exceptions from this
    public class CatchableException : PublicException
    {
    }

    // stuff that should never reach the users of my API
    internal class InvisibleException : System.Exception
    {
    }
}

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

0 голосов
/ 01 августа 2011

Это то же самое, что и область видимости. Все должно быть в нужном объеме.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...