Condition-Handler verwalten

Zuständigkeit von Condition-Handlern

Ein Condition-Handler ist zuständig entweder

  • für Conditions ab einer bestimmten Severity („Severity-Handler“), oder
  • für Conditions aus Meldungsgruppen, zu zu einer bestimmten Meldungsklasse gehören („Class-Handler).

Conditions, die eine Meldung aus einer Meldungsruppe ausgeben, die einer Meldungsklasse zugeordnet ist, werden immer von Class-Handlern behandelt und gelangen nie in einen von der Anwendung installierten Severity-Handler.

Implementierungsarten von Condition-Handlern

Die TAA-Infrastruktur unterstützt für .NET-Module „Proc-Handler“ und „ID-Handler“: bullet Für einen Proc-Handler wird in einem Modul eine Methode definiert, deren Name der TAA-Infrastruktur als Prozedur für den Proc-Handler angegeben wird. Diese Methode wird von der TAA-Infrastruktur aus aufgerufen, wenn eine Condition, für die dieser Condition-Handler zuständig ist, geraised wird.

Der Proc-Handler erhält als Argumente

  1. eine Referenz auf die aktuelle Modul-Instanz (ModlEnv)
  2. eine Referenz auf die geraiste Conditions (TaaCondition)

Der Proc-Handler sollte nach der Bearbeitung der Condition einen der folgenden Aktionscodes zurückliefern, auf die das Modul reagieren kann:

  • taaCndActResume
  • taaCndActExitArbg
  • taaCndActExitModl

Ein ID-Handler ist ein Stück Code in einer .NET-Fehlerbehandlungs-Routine (Exception Handling).

Wenn die TAA-Infrastruktur feststellt, dass für eine Condition ein ID-Handler zuständig ist, führt sie für diese Condition einen throw aus; die Exception ist vom Typ TeamWiSE.TAA.TaaCondition. Diese Exception kann vom nächstgelegenen Catch-Block abgefangen und bearbeitet werden:

catch (TeamWiSE.TAA.TAACondition cnd)
{
    Console.WriteLine("{0} Caught exception TAA.", cnd);
}

Über taaCndHdlIdGet() können Sie abfragen, welche Handler-ID für die geraiste Condition zuständig ist, um entsprechend zu reagieren.

Conditionhandler installieren

Methoden der Klasse ModlEnv

Severity Handler

  System.Boolean cndHdlPush ( System.UInt16 nSev )
  System.Boolean cndHdlIdSet ( System.UInt16 nSev , System.UInt32 nId )
  System.Boolean cndHdlProcSet ( System.UInt16 nSev , System.String sDllEntry )

Class Handler

  System.Boolean cndClassHdlPush ( String sClass )
  System.Boolean cndClassHdlIdSet ( String sClass , System.UInt32 nId )
  System.Boolean cndClassHdlProcSet (String sClass , System.String sDllEntry )

Um einen neuen Conditionhandler zu installieren, d.h. der Infrastruktur bekanntzugegen, welche Routine Conditions ab einer bestimmten Severity bzw. aus einer bestimmten Meldungsklasse bearbeiten soll, müssen Sie zunächst einen neuen Eintrag in der Liste bekannter Conditionhandler erzeugen. Dies geschieht über die Methode cndHdlPush/cndClassHdlPush. Als Argument geben Sie dabei an, ab welcher Severity bzw. für welche Meldungsklasse der der Condition-Handler aktiviert werden soll.

Anschließend müssen Sie für den installierten Condition-Handler angeben, mit welcher Prozedur die Conditions bearbeitet werden sollen. Dies geschieht über die Anweisungen cndHdlIdIdSet/cndClassHdldDSet bzw. CndhdlProcSet/cndClassHdlProcSet:

Me.cndHdlPush(TAACondition.Severity("Warning"));
Me.cndHdlProcSet(TAACondition.Severity("Warning"), "My_Hdl_W");
Me.cndHdlPush(TAACondition.Severity("Severe"));
Me.cndHdlIdSet(TAACondition.Severity("Warning"), 1);
Me.cndClassHdlPush("ALLGEMEIN");
Me.cndClassHdlProcSet("ALLGEMEIN", "My_Hdl_A");
Me.cndClassHdlPush("PRIVATE");
Me.cndClassHdlIdSet("PRIVATE", 1);

Mit den Anweisungen cndHdlIDSet/cndClassHdlIdSet und cndHdlProcSet/cndClassHdlProcSet ist es auch möglich, einen ConditionHandler zu verändern: Die Infrastruktur sucht den zuletzt in dem Modul installierten Condition-Handler für die angegebene Severity bzw. Meldungsklasse und weist diesem die angegebene Prozedur bzw. ID zu. Frühere Zuweisungen gehen dabei verloren.

Die TAA-Infrastruktur bildet Stapel (Stacks) für die Conditionhandler; Sie können in einem Modul mehrere Conditionhandler für dieselbe Severity bzw. Meldungsklasse installieren. Bei einem CndRaise gilt der zuletzt installierte.

setz

Severity Handler

  System.Boolean cndHdlPop ( System.UInt16 nSev )
  System.Boolean cndHdlClear (System.UInt16 nSev )
  System.Boolean cndHdlReset ( )

Class Handler

  System.Boolean cndClassHdlPop (  String sClass )
  System.Boolean cndClassHdlClear ( String sClass)
  System.Boolean cndClassHdlReset ( )

Durch CndHdlPop/CndClassHdlPop können Sie einzelne Conditionhandler wieder vom Stapel entfernen, und zwar wird immer der oberste vom Stapel ( = der zuletzte installierte) Conditionhandler entfernt.

  Me.cndHdlPop(TAACondition.Severity("Severe"));

CndHdlClear/CndClassHdlClear entfernt alle in dem Modul installierten Conditionhandler der angegebenen Severity bzw. Meldungsklasse.

  Me.cndHdlClear(TAACondition.Severity("Severe"));

Noch einen Schritt weiter geht CndHdlReset/cndClassHdlReset: Diese Methode entfernt alle von dem Modul installierten Conditionhandler für Severities bzw. Meldungsklasse.

  Me.cndHdlReset( );

ConditionHandler ersetzen

Severity Handler

  System.Boolean cndHdlReplace ( System.UInt16 nSev )

Class Handler

  System.Boolean cndClassHdlReplace ( String sClass )

Diese Methode entfernt den obersten, in dem Modul installierten Condition Handler für eine Severity bzw. Meldungsklasse und ersetzt ihn durch einen neuen.

Für den neuen Conditionhandler muss anschließend noch angegeben werden, ob es sich um einen Proc- oder Id-Handler handelt und welche Prozedur ausgeführt werden soll (CndHdlProcSet, CndHdlIdSet).

Installierte Conditionhander abfragen

Severity Handler

  System.Boolean cndHdlIsProc ( System.UInt16 nSev )
  System.Boolean cndHdlIsId ( System.UInt16 nSev )
  System.Boolean cndHdlIsControl ( System.UInt16 nSev )
  
  System.UInt32 cndHdlIdGet ( System.UInt16 nSev )

Class Handler

  System.Boolean cndClassHdlIsProc ( String sClass )
  System.Boolean cndClassHdlIsId ( String sClass )
  System.Boolean cndClassHdlIsControl ( String sClass )
  
  System.UInt32 cndClassHdlIdGet ( String sClass )

Mit den Methoden cndHdlIs…/cndClassHdlIs… können Sie abfragen, von welchem Typ der aktuell für eine Severity bzw. Meldungsklasse installierte ConditionHandler ist.

Dabei braucht der zu dem Zeitpunkt für die Severity oder Meldungsklasse angegebene Conditionhandler nicht unbedingt in dem aktuellen Modul installiert worden sein.

Im Falle von Severity-Handlern gelten für die Suche dieselben Regeln, die beim CndRaise angewandt werden:

  • Wenn für die angegebene Severity im aktuellen Modul kein Handler installiert ist, aber ein ConditionsHandler für eine niedrigere Severity installiert ist, so ist dieser Conditionhandler auch für die höhere Severity zuständig.
  • Wenn für weder für die angegebene Severity noch für eine niedrigere Severity in dem aktuellen Modul ein Conditionhandler installiert ist, wird geprüft, ob in einem aufrufenden Modul ein Handler für die angegebene Severity oder, wenn nicht, für eine niedrigere Severity installiert ist.

Bei ID-Handlern ist auch die ID abfragbar. Dies ist notwendig, um in der Fehlerbehandlungsroutine für ID-Handler entscheiden zu können, welche Aktion auszuführen ist.

dotnet:cndhdl · Zuletzt geändert: 16.07.2014 14:20

Copyright © 1992-2024 TeamWiSE Gesellschaft für Softwaretechnik mbH         Adressen |  Kontakt |  AGB |  Datenschutzerklärung |  Impressum