У меня есть бизнес-логика, которая улавливает некоторые логически неверные ситуации, например, пытается отменить транзакцию, которая уже была сторнирована.В этом случае правильным действием является информирование пользователя:
Транзакция уже сторнирована
или
Невозможно сторнировать сторнирование транзакции
или
У вас нет разрешения на отмену транзакций
или
Эта транзакция находится в сеансекоторая уже была закрыта
или
Эта транзакция слишком старая, чтобы ее можно было стереть
Вопрос в том, как мне сообщить об этихИсключительные случаи возвращаются к вызывающему коду, чтобы они могли показать пользователю?
Создаю ли я отдельное исключение для каждого случая:
catch (ETransactionAlreadyReversedException)
MessageBox.Show('Transaction already reversed')
catch (EReversingAReversingTransactionException)
MessageBox.Show('Cannot reverse a reversing transaction')
catch (ENoPermissionToReverseTranasctionException)
MessageBox.Show('You do not have permission to reverse transactions')
catch (ECannotReverseTransactionOnAlredyClosedSessionException)
MessageBox.Show('This transaction is on a session that has already been closed')
catch (ECannotReverseTooOldTransactionException)
MessageBox.Show('This transaction is too old to be reversed')
Недостатком этого является то, что, когда есть новый логическийслучай, чтобы показать пользователю:
Транзакции, созданные NSL, не могут быть отменены
я не просто показываю пользователю сообщение, а вместо этого он просачивается как необработанныйисключение, когда действительно это должно быть обработано с другим MessageBox
.
Альтернативой является создание одного класса исключений:
`EReverseTransactionException`
С учетом того, что любое исключение этого типа является логической проверкой, которая должна обрабатываться с окном сообщения:
catch (EReverseTransactionException)
Но все равно понятно, что любые другие исключения, которые включают, например, ошибку четности ECC в памяти, остаются необработанными.
Другими словами, я не преобразую все ошибки, которые могутбыть брошенным методом ReverseTransaction()
в EReverseTransactionException
, только те, которые являются логически неверной причиной пользователя.