Как установить точку останова при всех бросках?

Есть ли способ, каким образом мы можем указать точку останова, чтобы остановиться на всех операторах "throw"? (символическая точка останова)

guard let id = UInt(idString),
      let changeset = UInt(changesetString),
      let uid = UInt(uidString)
else {
      throw OSMVectorMapDescriptionError.ElementAttributeConversionError(element: xmlNode, attributeº: nil)
}

Ответы

Ответ 1

Просто нашел альтернативу в Xcode 8.3: в меню есть опция "Быстрая ошибка точки прерывания" для добавления новых специальных точек останова:

быстрая точка прерывания ошибок

Если вы щелкнете правой кнопкой мыши только что созданную точку останова, вы можете даже указать тип Error -конформирующий тип, который нужно разбить.

custom type

Ответ 2

Прежде всего следует помнить, что ошибки, возникающие в Swift, не являются исключениями, а просто ошибками (NSError, независимо от того, на основе ErrorType,...).

Во-вторых, не используйте try!, если вы не уверены, что он не потерпит крах или если вы действительно хотите, чтобы произошел сбой.

Не смешивайте символическую точку останова с точкой останова исключений. Разные звери.

Вернуться к вашему вопросу...

throw не является символом, поэтому символическая точка останова не работает для вас. Но есть способ...

(lldb)br s -E swift

-E <language> ( --language-exception <language> )
  Set the breakpoint on exceptions thrown by the specified language
  (without options, on throw but not catch.)

... это немного вводит в заблуждение, потому что заброшенные ошибки не являются исключениями. Имейте это в виду. Когда вы пытаетесь установить контрольную точку исключения в Xcode, нет Swift. Вероятно, главная причина заключается в том, что заброшенные ошибки не являются исключениями, и они не выяснили, куда еще поставить (кто знает).

Исключение точки останова - Изменить

Добавить вручную

Установите точку останова где-то в вашем коде, когда выполнение приостанавливается, просто введите br s -E swift в приглашении LLDB и затем продолжите.

Добавить автоматически

Установите точку останова где-то в вашем коде таким образом...

Точка останова br s -E swift

... и переключите его (вкл/выкл), когда вы хотите остановиться на throw.

Символическая точка останова

Когда вы используете уже упомянутый br s -E swift, вы обнаружите, что есть символ для throw. На самом деле это не throw, но swift_willThrow. Не стесняйтесь устанавливать символическую точку останова таким образом...

swift_willThrow символическая точка останова

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

Вы можете поделиться своей точкой останова по проектам Xcode следующим образом:

введите описание изображения здесь

... вторичный щелчок, переместить точку останова на, пользователь. Точка останова будет видна во всех проектах Xcode.

Когда вы нажмете точку останова, вы получите что-то вроде этого...

Точка прерывания на swift_willThrow

... и вам нужно выбрать предыдущий кадр стека, чтобы увидеть, где была выбрана ошибка...

Бросить стек стека