Intereting Posts
Почему я не могу указать, где я хочу, чтобы мой файл Kotlin был удален в Android Studio? Как позволить классу данных реализовать интерфейс / расширяет свойства суперкласса в Котлине? Сплит-алгоритм и часть просмотра с использованием шаблона стратегии в Котлине Могу ли я указать тип свойства в делегате? Android создает список / объект с информацией, сохраненной из другой активности Как создать пустой конструктор для класса данных в Kotlin Android Использование kotlin-stdlib 1.1.51, но загрузка kotlin-runtime 1.3 Как передать vararg в функцию или конструктор varag в Kotlin? Unity (C #) -> Kotlin <- Coroutines Как оживить ConstraintLayout снизу вверх экрана? Параметры аргумента функции kotlin по умолчанию из java Создание комментариев метода / класса Kotlin проверка отражения kotlin с нулевыми типами RxJava: Отменить подписку async, наблюдаемую из другого асинхронного производства Kotlin: Невозможно объявить аргумент типа mutableListOf в определении класса

Обертывание всех внутренних методов одним и тем же пробником в Котлине

Рассмотрим этот простой класс:

class Foo { fun a(x: Int) = ... fun b(x: Int) = ... fun c(x: Int, y: Int) = ... } 

Любая из функций класса может вызвать исключение. В этом случае я хотел бы зарегистрировать входные параметры метода. Я мог бы вручную записать блоки try-catch в каждом отдельном методе, но они бы сделали код уродливым и дублированным. Или – я мог бы попытаться найти какое-нибудь хорошее решение, чтобы сохранить код в порядке.

Есть ли способ автоматически создать блок try-catch и определить, что он должен делать? Что-то вроде:

 class Foo { @WithTryCatch fun a(x: Int) = ... @WithTryCatch fun b(x: Int) = ... @WithTryCatch fun c(x: Int, y: Int) = ... fun executeOnCatch() { log.fatal(...) } } 

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

 inline fun <T,R> safeExecute(block: (T)->R): R { try{ return block() } catch (e: Exception){ // do your handle actions } } 

Теперь вы можете использовать его в своих функциях:

 fun a(x: Int) = safeExecute{ //todo } 

Это простое, понятное и понятное решение с использованием простых понятий.

РЕДАКТИРОВАТЬ:

Для включения регистрации ошибок вы можете передать второй аргумент типа ()->String который предоставит сообщение в случае ошибки.

 inline fun <T,R> safeExecute(errorMsgSupplier: () -> String, block: (T) -> R): R { try{ return block() } catch (e: Exception){ // do your handle actions log.fatal(errorMsgSupplier()) } }