try {
... work ...
} catch ( InternalException e ) {
exceptionHelper. addGroup ( e, TestTest. class . getName ( ) , "... error ..." ,
new Pair ( "param1" , param1 ) ;
new Pair ( "param2" , param2 ) ) ;
throw e ;
} catch ( Exception e ) {
throw exceptionHelper. generate ( ErrorRef. SYSTEM_ERROR , "... error ..." ,
new Pair ( "param1" , param1 ) ;
new pair ( "param2" , param2 ) ;
new Pair ( "exception" , MySerialization. exceptionToString ( e ) ) ) ;
}
}
( defn middle [ a b ]
( ie / handler-ie ie / system-test "middle level processing" nil [ a b ]
( let [ result ( bottom a b ) ]
result ) ) )
( macroexpand- 1 ' ( ie / handler-ie ie / system-test "middle level processing" nil [ a b ]
( let [ result ( bottom a b ) ]
result ) ) )
( let [ params ( reverse ( zipmap ( map str ' [ a b ] ))
[ a b ] ) )
error-place ( current-function- name ) ]
( try ( let [ result ( bottom a b ) ]
result )
( catch errors . entities . internalexception e
( add-group-to-ie e error-place "middle level processing" params )
( throw e ) )
( catch java . lang . exception e
( let [ error-ref ( error-map ( . getname ( . getclass e ) ) )
error-ref ( if ( nil ? error-ref )
( make-system-error-ref system-test errorref-system- error )
error-ref )
ie ( make-ie error-ref error-place "middle level processing" e params ) ]
( throw ie ) ) ) ) )
( defn bottom [ a b ]
( ie / handler-ie ie / system-test "low level operation"
{ "java.lang.ArithmeticException" TestSystemEM $ ErrorRef / BAD_ARGS }
[ a b ]
( let [ result ( / a b ) ]
result ) ) )
( defn middle [ a b ]
( ie / handler-ie ie / system-test "middle level processing" nil [ a b ]
( let [ result ( bottom a b ) ]
result ) ) )
( defn tester [ a b ]
( let [ c ( + a b ) ]
( ie / handler-ie ie / system-test "public interface action" nil [ a b c ]
( let [ result ( middle a b ) ]
result ) ) ) )
user > ( try ( tester 1 2 )
( catch InternalException e
( println ( ie / human-readable-ie e ) ) ) )
1/2
user > ( try ( tester 1 0 )
( catch InternalException e
( println ( ie / human-readable-ie e ) ) ) )
ErrorRef: BAD_ARGS
Group parameters:
className: libs.error.example $ tester
message: public interface action
parameters:
name: a, value: <int> 1 </ int>
name: b, value: <int> 0 </ int>
name: c, value: <int> 1 </ int>
Group parameters:
className: libs.error.example $ middle
message: middle level processing
parameters:
name: a, value: <int> 1 </ int>
name: b, value: <int> 0 </ int>
Group parameters:
className: libs.error.example $ bottom
message: low level operation
parameters:
name: b, value: <int> 0 </ int>
name: a, value: <int> 1 </ int>
name: Exception, value: <java.lang.String> Error message: Divide by zero
java.lang.ArithmeticException: Divide by zero
at clojure.lang.Numbers.divide (Numbers.java:138)
at libs.error.example $ bottom.invoke (example.clj: 12)
at libs.error.example $ middle.invoke (example.clj: 17)
at libs.error.example $ tester.invoke (example.clj: 23)
...
</java.lang.String>
Source: https://habr.com/ru/post/130323/