[Raspberry Pi] Exception-Handling

import sys
 
try:
# provoziert Division durch 0 --> ArithmeticError
    a = 1/0
    print(a)
except ArithmeticError as err:
# Ausgabe der Exception
    print("Fehler:", err)
# detailliertere Infos
    print("Detail:", sys.exc_info())
else:
# optional: wird nur erreicht, wenn keine Exception
    print("Alles ok.")
finally:
# optional: wird in jedem Fall erreicht
    print("Aufräumen.")

# hier wieder regulärer Programmablauf
print("Normal weiter.")

Links

[JavaScript] Eigene Exceptions werfen

// https://www.w3schools.com/js/js_errors.asp
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error

try {
  throw new Error("Ein Error.");
  // throw new EvalError("Ein EvalError.");
  // throw new RangeError("Ein RangeError.");
  // throw new ReferenceError("Ein ReferenceError.");
  // throw new SyntaxError("Ein SytaxError.");
  // throw new TypeError("Ein TypeError.");
  // throw new URIError("Ein URIError.");
}
catch(e) {
  console.log(e);
}

[ABAP] OData: Exceptions / Messages vom Backend an das Frontend hochreichen

Exception-Klassen

* Business Logic Errors: /IWBEP/CX_MGW_BUSI_EXCEPTION
* Technical Errors:      /IWBEP/CX_MGW_TECH_EXCEPTION

Beispiel 1 (Message Container 1)

METHOD xyz_get_entity.
  SELECT SINGLE * FROM abc ...
  IF sy-subrc NE 0.
    mo_context->get_message_container( )->add_message_text_only( iv_msg_type = 'E'
                                                                 iv_msg_text = |Datensatz nicht gefunden.| ).

    RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
      EXPORTING
        message_container = mo_context->get_message_container( ).
  ENDIF.
ENDMETHOD.

Beispiel 2 (Message Container 2)

METHOD xyz_get_entity.
  SELECT SINGLE * FROM abc ...
  IF sy-subrc <> 0.
    mo_context->get_message_container( )->add_message( iv_msg_type   = 'E'
                                                       iv_msg_id     = 'SY'
                                                       iv_msg_number = '500'
                                                       iv_msg_text   = |Datensatz nicht gefunden.| ).

    RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
      EXPORTING
        message_container = mo_context->get_message_container( ).
  ENDIF.
ENDMETHOD.

Beispiel 3 (Message 1)

METHOD xyz_get_entity.
  SELECT SINGLE * FROM abc ...
  IF sy-subrc NE 0.
    RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
      EXPORTING
        textid  = /iwbep/cx_mgw_busi_exception=>business_error
        message = |Datensatz nicht gefunden.|.
  ENDIF.
ENDMETHOD.

Beispiel 4 (Message 2)

METHOD xyz_get_entity.
  SELECT SINGLE * FROM abc ...
  IF sy-subrc NE 0.
    DATA(lv_message) = VALUE scx_t100key( msgid = 'SY'
                                          msgno = '002'
                                          attr1 = |Datensatz nicht gefunden.| ).

    RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
      EXPORTING
        textid  = lv_message.
  ENDIF.
ENDMETHOD.

Beispiel 5 (BAPI return)

METHOD xyz_get_entity.
  DATA: lt_return TYPE bapirettab.
  
  CALL FUNCTION 'BAPI_XYZ'
    ...
    TABLES
      return = lt_return.
  
  IF lt_return IS NOT INITIAL.
    mo_context->get_message_container( )->add_messages_from_bapi( it_bapi_messages = lt_return
                                                                  iv_determine_leading_msg = /iwbep/if_message_container=>gcs_leading_msg_search_option-first ).

    RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
      EXPORTING
        message_container = mo_context->get_message_container( ).
  ENDIF.
ENDMETHOD.

Beispiel 6 (Exception)

METHOD xyz_get_entity.
  TRY.
      ...
    CATCH cx_root INTO DATA(e_txt).
      RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
        EXPORTING
          textid  = /iwbep/cx_mgw_busi_exception=>business_error
          message = |{ e_txt->get_text( ) }|.
  ENDTRY.
ENDMETHOD.

[ABAP] vordefinierte Ausnahmeklassen (Exception-Klassen) im System

Eine schöne Übersicht zu System-Exception-Klassen findet sich hier: Link

* häufig verwendete System-Ausnahmeklassen:

CX_ROOT
CX_SY_ARITHMETIC_ERROR
CX_SY_ZERODIVIDE
CX_SY_CREATE_OBJECT_ERROR
CX_SY_FILE_ACCESS_ERROR
CX_SY_ITAB_LINE_NOT_FOUND
CX_SY_SQL_ERROR

[ABAP] Exceptionhandling (obsolet)

Folgende Sprachelemente sollten nicht mehr angewendet werden, da sie mittlerweile obsolet sind:

Definition und Auslösen einer Exception

* Definition und Auslösen einer Exception
CLASS my_class DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS my_method
       IMPORTING var1 TYPE i
       EXCEPTIONS my_exception.
ENDCLASS.

* Auslösen einer Exception
CLASS my_class IMPLEMENTATION.
  METHOD my_method.
    ...
    RAISE my_exception.
    ...
  ENDMETHOD.
ENDCLASS.

Behandlung einer Exception

my_class=>my_method( EXPORTING var1 = 1
                     EXCEPTIONS my_exception = 1 ).
* Exception über sy-subrc abfragen
IF sy-subrc <> 0.
  MESSAGE 'Fehler.' TYPE 'I'.
ENDIF.

[ABAP] Objektorientiertes (OO) Exceptionhandling mit TRY … CATCH

Variante 1 (implizites Erzeugen von Objekten)

* DEMO_CATCH_EXCEPTION

START-OF-SELECTION.
  TRY.
      RAISE EXCEPTION TYPE cx_sy_zerodivide.
* Exception abfangen
    CATCH cx_sy_zerodivide INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 2 (explizites Erzeugen von Objekten)

START-OF-SELECTION.
  TRY.
      DATA(excp) = NEW cx_os_object_not_found( classname = 'MYCLASS' ).
      RAISE EXCEPTION excp.
* Exception abfangen
    CATCH cx_os_object_not_found INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 3 (explizites Erzeugen von Objekten – RE-RAISING)

START-OF-SELECTION.
  TRY.
      TRY.
          DATA(excp) = NEW cx_sy_file_open( filename = 'xyz.txt' ).
          RAISE EXCEPTION excp.
* Exception abfangen
        CATCH cx_root INTO DATA(exc).
* RE-RAISING einer neuen Exception
          RAISE EXCEPTION TYPE cx_sy_file_position
            EXPORTING
              previous = exc.
      ENDTRY.
* Exception abfangen
    CATCH cx_root INTO DATA(exc2).
      MESSAGE exc2->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 4 (Runtime Exceptions)

START-OF-SELECTION.
  TRY.
* implizites Erzeugen von Exception cx_sy_zerodivide
      DATA(erg) = 1 / 0.
* Exception abfangen
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 5 (Beispiel – Definition und Auslösen einer OO-Exception)

CLASS my_class DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: my_method
* Exception propagieren
      RAISING cx_sy_zerodivide.
ENDCLASS.
 
CLASS my_class IMPLEMENTATION.
  METHOD my_method.
    ...
* Auslösen der Systemexception cx_sy_zerodivide
    RAISE EXCEPTION TYPE cx_sy_zerodivide.
    ...
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Behandlung einer OO-Exception
  TRY.
* Funktionsaufruf, der Exception cx_sy_zerodivide auslösen kann
      my_class=>my_method( ).
* Exception cx_sy_zerodivide abfangen
    CATCH cx_sy_zerodivide INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Weiterführende Information: Link und Link

[Java] Exception stacktrace in String wandeln

/**
 * prints a stacktrace to a string
 * @param e the exception, those stacktrace to be printed
 * @return stacktrace
 */
public static String StackTraceToString(Exception e)
{
    String NEW_LINE = System.getProperty("line.separator");

    StackTraceElement[] stack = e.getStackTrace();
    
    String trace = "";
    
    for (StackTraceElement line : stack)
    {
        trace += line.toString() + NEW_LINE;
    }
    
    return trace;
}