Соответствующее исключение, которое выдается, если вы вручную обнаружили ошибку потоков - PullRequest
1 голос
/ 15 марта 2020

Предположим, я пишу многопоточный C# код. (Я знаю ... плохая идея из get- go;))

У меня есть некоторый код B, который, как я ожидаю, будет вызван только после завершения кода A. Я тщательно пишу и проверяю свой код, чтобы убедить себя в том, что это правда, но на самом деле я не могу реализовать это ожидание, я могу только проверить, верна ли она.

Поэтому я ставлю регистрирует, и если проверка когда-либо не проходит, я хочу выдать и исключение, чтобы разработчик получил большое кричащее сообщение в журнале, говорящее: «Нет, ты облажался; есть еще крайний случай, когда многопоточность не делает то, что ты убедил себя в этом. "

Какой лучший C# Exception тип бросить здесь?

Мой инстинкт go с этим старым стандартом InvalidOperationException или, возможно, просто new Exception(message). Но было бы неплохо, если бы у меня был чуть более конкретный тип c, который я мог бы выбросить (например, бросить ArgumentException, когда возникла проблема)

Есть несколько типов Exception, которые автоматически завершите с Thread или Sync, но все они выглядят так, как будто предназначены для более глубоких проблем. то есть что-то не так с фактическими потоками. Здесь все в порядке ... это логика потоков разработчика c, в котором есть ошибка.

Есть ли здесь какие-либо разумные предсуществующие классы Exception, которые можно использовать?

1 Ответ

3 голосов
/ 15 марта 2020

InvalidOperationException является наиболее подходящим встроенным исключением для этой ситуации.

См. раздел официальных замечаний к документации:

InvalidOperationException используется в случаи, когда отказ вызвать метод вызван причинами, отличными от недопустимых аргументов. Как правило, он генерируется, когда состояние объекта не может поддерживать вызов метода.

(выделено мной).

Конечно, вас ничто не останавливает от создания своего собственного Exception класса, если вы хотите что-то более конкретное c, но это имеет смысл, только если вы хотите, чтобы исключение содержало информацию, которая не вписывается в InvalidOperationException (и, конечно, если вы это делаете выберите создание собственного класса исключений, следуйте инструкциям в Как создавать определяемые пользователем исключения :

  1. Получать из существующего Exception класса
  2. используйте слово Exception в качестве суффикса к имени класса (MyVeryOwnSpecialException)
  3. Реализуйте не менее трех конструкторов publi c:
    3.a: Конструктор без параметров
    3.b: Конструктор, который принимает строковое сообщение
    3. c: Конструктор, который принимает строковое сообщение и внутреннее исключение Exception.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...