package Ġorg . kot link . core . ex posed Ċ Ċ import Ġorg . aspect j . lang . Pro ceeding Join Point Ċ import Ġorg . aspect j . lang . annotation . Around Ċ import Ġorg . aspect j . lang . annotation . Aspect Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . lang . reflect . Un declared Throwable Exception Ċ Ċ /** Ċ Ġ* ĠMakes Ġsure ĠP SQLException , ĠEx posed SQLException , ĠUndeclared Throwable Exception Ġand Ġsuch Ċ Ġ* Ġaren 't Ġthrown Ġby Ġthe Ġrepositories . Ċ Ġ*/ Ċ @ Aspect Ċ @ Component Ċ @ Suppress (" Too Generic Exception Ca ught ", Ġ" Throws Count ", Ġ" Sw allowed Exception ", Ġ" Re throw Ca ught Exception ") Ċ class ĠDatabase Exception Aspect Ġ{ ĊĊĠĠĠ Ġ@ Around (" execution (* Ġorg . kot link . core .. *( .. )) Ġ&& Ġ@ target ( org . springframework . stereotype . Repository )") ĊĠĠĠ Ġ@ Throws ( Throwable :: class ) ĊĠĠĠ Ġfun Ġnormalize Exceptions ( join Point : ĠPro ceeding Join Point ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjoin Point . proceed () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUndeclared Throwable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġun wrapping ĠUndeclared Throwable Exception Ġand Ġre - wrapping Ġits Ġcause Ġinto ĠDatabase Exception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDatabase Exception ( e . cause ?. message , Ġe . cause ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunchecked Ġexceptions Ġare Ġsafe Ġto Ġre - throw Ġas Ġthey Ġaren 't Ġtranslated Ġinto ĠUndeclared Throwable Exception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġwrap Ġany Ġchecked Ġexception Ġinto ĠDatabase Exception , Ġso Ġthat Ġthey Ġdon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDatabase Exception ( e . message , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }