Objective C / Какао, эквивалентное из C# ManualResetEvent

Как несколько ответов указали, скажите Visual Studio повреждаться на Броске для NullReferenceException.

, Как сказать VS повреждаться, когда необработанные исключения брошены

  • меню Debug | Исключения (или Ctrl + Высокий звук + E )
  • Развертка в Исключения Общеязыковой среды выполнения
  • , Развертка в Систему
  • Находит Систему. NullRefernceException, и устанавливают флажок для Повреждения каждый раз, когда это исключение выдается, вместо того, чтобы позволить ему продолжаться к любым блокам Выгоды существуют

Поэтому теперь, когда это произойдет, VS сразу повредится, и Текущая строка Оператора будет находиться по выражению, которое оценило к пустому указателю.

Это средство полезно для всех видов исключений, включая пользовательские (может добавить полностью определенное имя типа, и VS будет соответствовать ему во время Отладки)

, один недостаток к этому подходу состоит в том, если существует код, загруженный в отладчике, который следует плохой практике броска и ловли большого количества исключений, которые Вы ищете, в этом случае это возвращается в стог сена / проблема иглы (если Вы не можете зафиксировать тот код, конечно - тогда Вы решили две проблемы:)

Еще один прием, который может пригодиться (но только на некоторых языках) является использованием Когда (или эквивалентный) ключевое слово... В VB это похоже

Try
  ' // Do some work           '
Catch ex As Exception When CallMethodToInspectException(ex)

End Try

, прием здесь - то, что, Когда выражение оценено , прежде чем стек вызовов раскручен к блоку Выгоды . Таким образом, при использовании отладчика можно установить точку останова, что выражение, и если Вы смотрите на окно стека вызовов (Отладка | Windows | Стек вызовов), Вы видите и перешли для выравнивания, который инициировал исключение.

(Можно принять решение возвратить false от CallMethodToInspectException, таким образом, блок Выгоды будет проигнорирован и время выполнения продолжит поиск через стек для соответствующего блока Выгоды - который может допускать вход, который не влияет на поведение, и с меньше служебным, чем выгода и перебросок)

, Если Вы просто интересовались неинтерактивным входом, затем предполагая, что у Вас есть Отладочная сборка (или в некоторой степени как Вы имеете, заключают сделку с проблемами оптимизации, Сборку конечных версий с PDBs), Вы могли добраться, большая часть информации должна была разыскать ошибку от Исключения ToString с включенным stack-trace-with-line-number.

, Если однако номер строки не был достаточно, можно получить номер столбца также (так в значительной степени, локальная деталь или выражение, которое является пустым) путем извлечения StackTrace для исключения (использующий или вышеупомянутую технику, или только в самом блоке выгоды):

int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();

, В то время как я не видел то, что он делает для NullReference или других исключительных ситуаций во время выполнения, может также интересоваться рассмотрением Охотник за Исключением как инструмент статического анализа.

10
задан Cœur 11 December 2017 в 03:42
поделиться

2 ответа

Я не очень хорошо знаком с ManualResetEvent, но на основе документации , похоже, класс NSCondition может быть тем, что вы ищете.

NSCondition ни в коем случае не является точным эквивалентом, но он обеспечивает аналогичные функции сигнализации. Вы также можете прочитать на NSLock .

8
ответ дан 4 December 2019 в 01:31
поделиться

Ah, those are poor man's condition variables.

You could use the NSCondition class, but I think it's better
to go straight to the source. Start with pthread_cond_init.

You gonna love it.

0
ответ дан 4 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: