Изменение данных в Exception - документированно или нет?
От: Doc Россия http://andrey.moveax.ru
Дата: 02.04.21 10:42
Оценка:
Подскажите пожалуйста, изменение данных в 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 - документированно или нет?
От: Xander Zerge Россия www.zerge.com
Дата: 02.04.21 12:22
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Подскажите пожалуйста, изменение данных в Exception перед повторым выбосом является документированным или "случайно так вышло" и на такое лучше не полагаться?


Случайно не навертели клонирование объекта исключения только чтобы не дать программисту внести изменения в исключение, которое он поймал? Так это элементарно обходится явным указанием пойманного исключения во "throw".

Полагаться можно, но такая практика не приветствуется.
Серёжа Новиков,
программист
Re[2]: Изменение данных в Exception - документированно или нет?
От: Doc Россия http://andrey.moveax.ru
Дата: 02.04.21 12:34
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>Случайно не навертели клонирование объекта исключения только чтобы не дать программисту внести изменения в исключение, которое он поймал?


Нет. Идея была как раз обратная — поменять значение одного своего поля в своем кастомном исключении для упрощения обработки уровнем выше и сохранением всей остальной информации Exception вклюая стек трейс.
Re[3]: Изменение данных в Exception - документированно или нет?
От: Xander Zerge Россия www.zerge.com
Дата: 02.04.21 15:39
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Нет. Идея была как раз обратная — поменять значение одного своего поля в своем кастомном исключении для упрощения обработки уровнем выше и сохранением всей остальной информации Exception вклюая стек трейс.


Вот для этого выбрасывается новое исключение с нужным значением своего поля, с пойманным исключением, помещённым в InnerException.
Так будет сохранена вся информация, стек-трейс, а также будет чётко видно, кто в это поле и в какой точке пролёта исключения записал информацию.
Серёжа Новиков,
программист
Re[4]: Изменение данных в Exception - документированно или нет?
От: Doc Россия http://andrey.moveax.ru
Дата: 03.04.21 14:00
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>Вот для этого выбрасывается новое исключение с нужным значением своего поля, с пойманным исключением, помещённым в InnerException.

XZ>Так будет сохранена вся информация, стек-трейс, а также будет чётко видно, кто в это поле и в какой точке пролёта исключения записал информацию.

Ну я с эти и не спорю, но и другие варианты вполне возможны (с сохранением всей информации об ошибке и неразглашении лишнего в другие слои).
Re: Изменение данных в Exception - документированно или нет?
От: RushDevion Россия  
Дата: 05.04.21 20:26
Оценка: 80 (3) +1
Здравствуйте, Doc, Вы писали:

Doc>Подскажите пожалуйста, изменение данных в Exception перед повторым выбосом является документированным или "случайно так вышло" и на такое лучше не полагаться?


У Exception с первых версий .NET было свойство Data для хранения всякой-разной доп.инфы.
И модифицировать его перед перед rethrow, судя по примерам, нормальная практика.
Так что, наверное, да, можно считать такое поведение документируемым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.