Did it ever happen that you wanted to use a standard Function Module in your application instead of rewriting the whole logic? And the function was "tailored" for classic dynpros but you were calling it in a background application ... and this little devil had the following syntax:

IF sy-subrc <> 0.
    MESSAGE 'Critical Error' TYPE 'E'.

Normally, this would interrupt the processing of the application instead of letting you handle the error as you see fit. There is a way, though it's not obvious how you could catch it.

Let's say we have the following function:

    MESSAGE 'Critical Error' TYPE 'E'.

In order to catch this error, you need to call the FM with the exception ERROR_MESSAGE

        error_message = 1.
IF sy-subrc = 1.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        INTO DATA(lv_error).

The number of the exception is not important, it can be anything you want.

If code would be always written in a correct way, no one should stumble upon this issue. But hey, this is the real world! At least we have a solution. However, I have to say, it is a rare issue. This only happened to me once in my whole programming career. And that was enough to question why I chose to become one.

More information can be found in the ABAP Documentation.