Подскажите пожалуйста, изменение данных в Exception перед повторым выбосом является документированным или "случайно так вышло" и на такое лучше не полагаться?
public class MyException : Exception
{
public string Id { get; set; }
public MyException() : base("Exception happen.") {}
}
// Кодtry {
try {
throw new MyException() { Id = "Init" };
}
catch (Exception ex) {
if (ex is MyException mex) {
Console.WriteLine($"INNER: {mex.Id}");
mex.Id = "Updated";
throw;
}
else
Console.WriteLine("INNER: NONE");
}
}
catch (Exception ex) {
if (ex is MyException mex)
Console.WriteLine($"OUTER: {mex.Id}");
else
Console.WriteLine("OUTER: NONE");
}
Получаем:
INNER: Init
OUTER: Updated
Re: Изменение данных в Exception - документированно или нет?
Здравствуйте, Doc, Вы писали:
Doc>Подскажите пожалуйста, изменение данных в Exception перед повторым выбосом является документированным или "случайно так вышло" и на такое лучше не полагаться?
Случайно не навертели клонирование объекта исключения только чтобы не дать программисту внести изменения в исключение, которое он поймал? Так это элементарно обходится явным указанием пойманного исключения во "throw".
Полагаться можно, но такая практика не приветствуется.
Серёжа Новиков,
программист
Re[2]: Изменение данных в Exception - документированно или нет?
Здравствуйте, Xander Zerge, Вы писали:
XZ>Случайно не навертели клонирование объекта исключения только чтобы не дать программисту внести изменения в исключение, которое он поймал?
Нет. Идея была как раз обратная — поменять значение одного своего поля в своем кастомном исключении для упрощения обработки уровнем выше и сохранением всей остальной информации Exception вклюая стек трейс.
Re[3]: Изменение данных в Exception - документированно или нет?
Здравствуйте, Doc, Вы писали:
Doc>Нет. Идея была как раз обратная — поменять значение одного своего поля в своем кастомном исключении для упрощения обработки уровнем выше и сохранением всей остальной информации Exception вклюая стек трейс.
Вот для этого выбрасывается новое исключение с нужным значением своего поля, с пойманным исключением, помещённым в InnerException.
Так будет сохранена вся информация, стек-трейс, а также будет чётко видно, кто в это поле и в какой точке пролёта исключения записал информацию.
Серёжа Новиков,
программист
Re[4]: Изменение данных в Exception - документированно или нет?
Здравствуйте, Xander Zerge, Вы писали:
XZ>Вот для этого выбрасывается новое исключение с нужным значением своего поля, с пойманным исключением, помещённым в InnerException. XZ>Так будет сохранена вся информация, стек-трейс, а также будет чётко видно, кто в это поле и в какой точке пролёта исключения записал информацию.
Ну я с эти и не спорю, но и другие варианты вполне возможны (с сохранением всей информации об ошибке и неразглашении лишнего в другие слои).
Re: Изменение данных в Exception - документированно или нет?
Здравствуйте, Doc, Вы писали:
Doc>Подскажите пожалуйста, изменение данных в Exception перед повторым выбосом является документированным или "случайно так вышло" и на такое лучше не полагаться?
У Exception с первых версий .NET было свойство Data для хранения всякой-разной доп.инфы.
И модифицировать его перед перед rethrow, судя по примерам, нормальная практика.
Так что, наверное, да, можно считать такое поведение документируемым.