Как установить точку останова в Kotlin требуют с отладчиком IntelliJ? - PullRequest
0 голосов
/ 26 апреля 2018

Стандартная библиотека Kotlin имеет аккуратную функцию require, что-то вроде времени выполнения assert:

@kotlin.internal.InlineOnly
public inline fun require(value: Boolean, lazyMessage: () -> Any): Unit {
    contract {
        returns() implies value
    }
    if (!value) {
        val message = lazyMessage()
        throw IllegalArgumentException(message.toString())
    }
}

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

enter image description here

Сначала я подумал, что это потому, что require - это inline функция. Я провел эксперимент с одной из моих inline функций, и отладчик остановился, как и ожидалось.

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

Я хотел бы знать , как заставить его работать, но меня также интересует , почему из "это не работает".

1 Ответ

0 голосов
/ 14 мая 2018

В настоящее время невозможно установить точки останова в Kotlin для функций, помеченных InlineOnly аннотацией, и require является одной из таких функций. Встроенные функции, помеченные этой аннотацией, не предоставляют дополнительную отладочную информацию для сохранения строки с сайта вызова, не тронутой в трассировке стека, но также разрушают установку точек останова внутри (https://youtrack.jetbrains.com/issue/KT-24306).

Вы нашли один обходной путь - использование точек останова исключения (https://www.jetbrains.com/help/idea/creating-exception-breakpoints.html). IllegalArgumentException будет лучшим классом в этом случае.

Если в вашем коде есть вызовы, которые не работают, они могут быть заменены пользовательской функцией в качестве другого обходного пути.

(Ответ был обновлен. В предыдущей версии ошибочно утверждалось, что точки останова в require могут работать для некоторых вызовов.)

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