注释在 Kotlin 中不起作用,初始化错误?



我正在为 Kotlin 项目开发一个小功能,我正在尝试做一个注释。

我想将一种方法"封装"在 try catch 中。

假设我注释了这样的方法

@LogException
fun foo(){
//do something
}

所以我想处理注释以便稍后执行以下操作:

try{
foo()
}catch(exception: Exception){
// do something
//log
}

甚至可能吗?

我从 Kotlin 教程开始(应该与 Java 没有太大区别( https://medium.com/@elye.project/annotation-tutorial-for-dummies-in-kotlin-1da864acc442 但是我正在使用这个

@AutoService(Processor::class) 

注册我的处理器,我认为没有初始化我的注释。

到目前为止,这是我的代码:

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.SOURCE)
@Documented
annotation class LogException(
val name: String,
val statusCode: Int = 500
)

和我的处理器:

@AutoService(Processor::class)
class MyProcessor : AbstractProcessor() {
val logger = LoggerFactory.getLogger(MyProcessor::class.java)
override fun process(annotations: MutableSet<out TypeElement>?, roundEnv: RoundEnvironment?): Boolean {
//do something
logger.info("info")
return false
}
override fun getSupportedAnnotationTypes(): MutableSet<String> {
logger.info("info")
return mutableSetOf(LogException::class.java.canonicalName)
}
}

目前,我无法在我的日志中看到任何内容,或者即使我将其更改为异常。

我在方法中使用此注释。

@LogException
fun foo(){
//do something
}

知道我错过了什么吗?

//做某事和//log 某事只是不粘贴所有代码的示例

无法使用注释处理器更改现有代码。他们只能创建新文件。如果要更改现有的插件,请编写 Kotlin 编译器插件。

如果您只想摆脱样板捕获块,请使用inline函数,该函数用try-catch包装原始函数:

inline fun runLogging(code: () -> Unit) = try {
code()
} catch (e: Exception) {
yourLogger.log(e)
}
fun foo() = runLogging {
throw Exception() // will be logged
}

或者你可以创建runLogging只处理指定异常的泛型函数:

inline fun <reified E : Exception> runLogging(code: () -> Unit) = try {
code()
} catch (e: Exception) {
if (e is E) yourLogger.log(e)
else throw e
}
fun foo() = runLogging<FileNotFoundException> {
throw FileNotFoundException() // will be logged
}
fun bar() = runLogging<FileNotFoundException> {
throw Exception() // will be rethrown
}

相关内容

  • 没有找到相关文章

最新更新