I wonder if it is in fact catching the zcx_bw_sd_code exception and your uncaught exception is the one you're raising within the catch:
CATCH zcx_bw_sd_code INTO gl_cx.
gv_text = gl_cx->get_text( ).
monitor_rec-msgid = 'Z001'.
monitor_rec-msgty = 'I'.
monitor_rec-msgno = 040.
monitor_rec-msgv1 = gv_text.
APPEND monitor_rec TO MONITOR
RAISE EXCEPTION TYPE CX_RSROUT_ABORT.
ENDTRY.