AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?
Thema durchsuchen
Ansicht
Themen-Optionen

dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

Ein Thema von Der schöne Günther · begonnen am 15. Mär 2016 · letzter Beitrag vom 15. Mär 2016
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 09:19
Ich habe folgendes Szenario: Prozesstechnische Exceptions haben über das Feld Message einen aussagekräftigen Text. Manchmal bekommt der Benutzer den auch zu sehen, manchmal wird der nur gelogged. Ganz simpel:

Delphi-Quellcode:
type
   EDeviceException = class(System.SysUtils.Exception)

resourcestring   
   ovenBrokeDownAgainFmt = 'No cookies for you because the oven broke down for the %dth time';

implementation

   procedure makeCookies();
   begin
      if oven.isMalfunctioning() then begin
         Inc(malfunctioningTimes);
         raise EDeviceException.CreateFmt(ovenBrokeDownAgainFmt, [malfunctioningTimes]);
      end;
   end;
end;

Das Problem: Wenn die Anwendung jetzt auf Mondsprache läuft steht in ovenBrokeDownAgainFmt natürlich etwas anderes drin (z.B. "あなたのためのクッキーをオーブンは%d 番目の時間のために決裂していないので、"). Das ist erst einmal gut wenn der Nutzer das auf dem Bildschirm zu sehen bekommt. Allerdings ist es ziemlich blöd wenn jemand aus dem Support sich Logs anschaut und dort steht unverständliche Fremdsprache.

Die Exception wird durch einen eigene Prozedur für Application.OnException gelogged. Zu dem Zeitpunkt hat man nur noch sein Exception-Objekt in welchem dieser String bereits fest eingebacken ist. Ich muss nun irgendwie "rückübersetzen".

Kann man, mit dxGetText, irgendwie bewerkstelligen? Ich finde nichts.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 16:14
Zum Titel: Ja!
Am Besten für künftige Versionen von resourcestring auf const stellen.
Das sind ja eh interne Fehlermeldungen, die den Benutzer nichts angehen (sollten).

Wird in den Logs nicht noch zusätzlich der Typ der Exception abgespeichert?
Also hier jetzt die EDeviceException? Oder loggst du nur die Message?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 16:44
Es ist leider sehr viel der Basistyp EDeviceException , nicht z.B. EOvenIsMalfunctioningException .

Alles von diesem Basistyp bekommt der Nutzer auch angezeigt. Die Exception-Message ist z.B. "Der Ofen kann nicht heizen wenn die Klappe offen ist".

Im Logfile steht Zeit, Exception-Klasse, der Text und der Callstack. Für einen Entwickler ist die Sache damit klar, jemand aus dem Support kann aber nur mit der Nachricht etwas anfangen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#4

AW: dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 16:48
Wie wird die Exception denn angezeigt? Benutzt du das interne Verfahren, sowas wie madExcept oder was eigenes?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 17:03
Nein, das ist einfach nur ein selbst gebautes VCL-Fenster mit einem traurigen Smiley, dem Exception-Text und einem Button für eine Diagnose-Zip-Datei auf einen Stick zu speichern.

Warum, was würde das ändern?

Aber so wie es aussieht habe ich schon eine Lösung:

Ein Ressourcenstring ist erst einmal ein TResStringRec und kein String!

Ich habe der Exception-Oberklasse also einen neunen Konstruktor hinzugefügt:

Delphi-Quellcode:
   EDeviceException = class(Exception)
      public var
         resStr: PResStringRec;
      public
         constructor Create(const resStr: PResStringRec); {$If Defined(Test)}overload;{$Endif}
   end;

constructor EDeviceException.Create(const resStr: PResStringRec);
var
   translated: String;
begin
   self.resStr := resStr;

   translated := System.LoadResString(resStr);
   inherited Create(translated);
end
.

Heißt: Es geht weiter wie bislang. Aber das Exception-Objekt hat jetzt noch einen Verweis auf den originalen Ressourcen-String. Vorausgesetzt ich sage fortan nicht mehr
raise EDeviceException(someText) sondern
raise EDeviceException(@someText) Beim Loggen der Exception kann ich mich dann an diesem PResStringRec wieder zu einem englischen oder deutschen Text hangeln.

Jetzt darf ich nur den CreateFmt-Konstruktor nicht vergessen und dann sieht das schon sehr gut aus
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#6

AW: dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 17:54
Wären nicht diese Konstruktornamen besser geeignet?

CreateRes
CreateResFmt
CreateResFmtHelp
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: dxGetText: Exceptions zu lokalisieren war ein Fehler, oder?

  Alt 15. Mär 2016, 18:05
Wie konnte ich das übersehen!

Vielen Dank, das nimmt ja ein echtes Happy End
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz