2017-10-01 7 views
4

에서 같은 시도 - 캐치 모든 내부 방법이 간단한 클래스를 생각해 보자. 이 경우 메서드의 입력 매개 변수를 기록하고 싶습니다. 나는 매 시도마다 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(...) 
    } 
} 
+1

그런 종류의 물건을 AOP 시스템에 위임하고 해당 try/catch 블록으로 코드를 오염시키지 않아야합니다. –

답변

2

당신이를 제외하고 당신이 당신의 코드 블록을 통과 고차 함수를 작성하고 처리 할 수있는 :

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 
} 

간단한 개념을 사용하여 쉽고 깨끗하며 읽기 쉬운 솔루션입니다.

EDIT :

오류 로깅을 가능하게하기 위해, 오류의 경우에 메시지를 제공 할 것이다 ()->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()) 
     } 
} 
+1

당신은 또한 아마도 다음을 원할 것이다 : 1. 에러 메시지를 생성하기위한 추가'() -> String' 인수; 2. 함수를'inline'으로 만듭니다. –

+0

@AlexeyRomanov 맞아요, 인라인을 추가했지만 문자열에 함수 리터럴을 사용 했나요? 가능하다면 두 개의 람다를 전달하는 것을 싫어합니다. 간단한 문자열이 적절하다고 생각하지 않습니까? 'safeExecute ("error") {...}' – s1m0nw1

+1

메소드의 인수를 로깅 할 수 없습니다. –