Welche Methode ist das eigentlich?

Heute ein wirklich kurzer Trick, um den Klassen- und Methodennamen der Methode heraus zu bekommen, in der man sich gerade befindet. Diese Information ist sehr nützlich, um genauere Protokolle zu schreiben oder dem Anwender oder Entwickler bessere Informationen bei einem Programmfehler geben zu können.

Eine Einschränkung gibt es bei diesem Trick: Der Name der Methode kann leider bei einer lokalen Klasse nicht ermittelt werden.

Achtung! Hier kommt er:

Type-Pool BCB in den Eigenschaften der globalen Klasse bekannt geben:

2016-10-18_10-23-19

In der Methode folgendes Coding aufrufen:

*== Klassennamen ermitteln
bcb_constant_class_name.
write: / 'Class:', class_name.

*== Klassennamen->Methodenname ermitteln
bcb_constant_method_name.
write: / 'Method:', method_name.

Das Original

Hier der Vollständigkeit halber das zu Grunde liegende Coding der beiden Makros aus dem Type-Pool BCB:

bcb_constant_class_name

data __class_descr__ type ref to cl_abap_typedescr.
__class_descr__ = cl_abap_classdescr=>describe_by_object_ref( me ).
data class_name type string.
class_name = __class_descr__->get_relative_name( ).

bcb_constant_method_name

data __exception__ type ref to cx_bcb_exception.
try.
* force an exception...
   raise exception type cx_bcb_exception
         exporting area_code = '0' error_code = '0' msg = '0'.
catch cx_bcb_exception into __exception__.
*  ... caught right after
  data __include__ type syrepid.
__exception__->get_source_position( importing include_name = __include__ ).
*   map include name to method name
  data __program_name__ type programm.
__program_name__ = __include__.
  data __method__ type seocpdkey.
  call function 'SEO_METHOD_GET_NAME_BY_INCLUDE'
       exporting
         progname = __program_name__
       importing
         mtdkey   = __method__.
*  get class and method names
*  data class_name  type string.
*  class_name = __method__-CPDNAME.
  data method_name type string.
  concatenate __method__-clsname '->' __method__-cpdname into method_name.
endtry.
Weiterhin funktionieren tut natürlich auch der Trick mit ABAP_CALLSTACK.
image_pdfimage_print