Почему мне всегда следует делать свои исключения [сериализуемыми]?(.СЕТЬ)
-
21-08-2019 - |
Вопрос
Ссылаясь на Как правильно сделать сериализуемое пользовательское исключение .NET?
и Все ли исключения .NET сериализуемы? ...
Почему мои исключения должны быть сериализуемыми?
Кто-то сказал, что «это можно считать ошибкой», если пользовательское исключение, определенное сторонней библиотекой, не подлежит сериализации.Почему?
Почему в этом отношении исключения отличаются от других классов?
Решение
Поскольку ваши исключения, возможно, придется распределять между разными доменами приложений, и если они не будут (должным образом) сериализоваться, вы потеряете ценную информацию об отладке.В отличие от других классов, вы не сможете контролировать, будет ли маршалироваться ваше исключение — оно будет.
Когда я имею в виду «у вас не будет контроля», я имею в виду, что создаваемые вами классы обычно имеют конечное пространство существования, и это существование хорошо известно.Если это возвратное значение, и кто -то пытается вызвать его в другом приложении (или на другой машине), он получит ошибку и может просто сказать «не используйте его таким образом». Вызывающий абонент знает, что он должен преобразовать его в тип, который может быть сериализован (путем обертывания вызова метода).Однако, поскольку исключения всплывают на самый верх, если их не перехватить, они могут выйти за границы AppDomain, о которых вы даже не подозревали.Исключение вашего пользовательского приложения на глубине 20 уровней в другом AppDomain может быть исключением, о котором сообщает Main(), и ничто на этом пути не преобразует его в сериализуемое исключение для вас.
Другие советы
В дополнение к ответу Талджо ваши исключения также могут передаваться через веб-службы, в этом случае исключение должно быть сериализуемым/десериализуемым, чтобы его можно было преобразовать в XML и передать веб-службой.
Я думаю, что по умолчанию для всех классов должен быть сериализуемый, если только они не содержат класс, который явно не сериализуем.Раздражает невозможность перенести класс только потому, что какой-то дизайнер об этом не подумал.
То же самое и с «Final», все переменные должны быть «Final» по умолчанию, если вы специально не укажете, что они «Mutable».
Кроме того, я не уверен, что имеет смысл иметь переменную, которая не является частной.
Ну что ж, нужно создать свой собственный язык.
Но ответ в том, что вы не знаете, как будет использоваться ваше исключение, и предполагается, что они могут быть выброшены при удаленных вызовах.
Еще одно место, где объекты должны быть сериализуемыми, — это сеанс Asp.Net.Мы храним последнее исключение в сеансе, а не сериализуемые исключения требуют дополнительного перевода, чтобы сохранить их данные как сериализуемые (указание исходного исключения как внутреннего не помогает)