Исключения отличаются от событий, потому что у вас есть для их обработки.
Если вы думаете, код клиента просто не может продолжаться , выбросить исключение (примеры: ошибка сети, ошибка безопасности, неверный ввод).В противном случае, любезно подтвердите, что что-то произошло , вызвав событие , но не заставляйте звонящего реагировать немедленно.
Также обратите внимание, что события могут быть вызваны и обработаны асинхронно и не привязаны к конкретным действиям вызывающего, тогда как исключения всегда генерируются в контексте определенного вызова метода.Конечно, вы можете генерировать исключения из любого места, но если клиентский код не ожидает их там, где они происходят, они становятся практически бесполезными, потому что не обрабатываются.
См. Также этот поток .
Что касается вашей ситуации:
Очевидно, в вашем случае рабочий процесс не может продолжаться, пока не закрыто стороннее приложение, и эта ситуация не совсем нормальная, то естьбольше технических ограничений, чем истинный вариант рабочего процесса.Вы также не можете позволить клиентскому коду просто игнорировать его.Это соответствует исключительной природе немедленного ответа.
Однако верно также и то, что эта ситуация не является единственной - исключительной , поскольку на некотором уровне она известна и ожидается.
Поэтому я предлагаю вам сделать следующее:
- ввести свойство
CanRunNow
, которое определяет, запущено ли приложение; - проверить это свойство в коде клиента перед вызовом
Run
метод (предположим, он так называется); - в методе
Run
, выполните проверку еще раз, и если на этот раз CanRunNow
равно false
, сгенерируйте исключение (теперь этоЭто неожиданно!)
Таким образом, вы предоставляете клиентскому коду свободу и ответственность за то, чтобы либо выполнить проверку и оставаться в безопасности, либо идти вперед (и, возможно, получить исключение). Какое бы поведение вы ни выбрали, обязательно запишите это!