AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Exceptions

Ein Thema von Pseudemys Nelsoni · begonnen am 19. Mai 2004 · letzter Beitrag vom 19. Mai 2004
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Exceptions

  Alt 19. Mai 2004, 04:57
Delphi-Quellcode:
function ReadRegString(const KEY_NAME: HKEY; KeyPath, Key: string): string;
var
  KeyH : HKEY;
  dwLen : DWORD;
  value : string;
begin
  Result := '';
  if RegOpenKeyEx(KEY_NAME, PAnsiChar(KeyPath), 0, KEY_READ, KeyH) = ERROR_SUCCESS then
  Try
    Try
      dwLen := 0;
      if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, nil, nil, @dwLen) = ERROR_SUCCESS then
      begin
        Setlength(value, dwLen - 1);
        if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, nil, @value[1], @dwLen) = ERROR_SUCCESS then
          Result := value
        else Error(1);
      end
      else Error(1);
    except
      Error(1);
    end;
  Finally
    RegCloseKey(KeyH);
  end
end;

moin!

sind die "Try's" unnütz hier? ich weiss nämlich nicht ob es irgendeine api funktion gibt die eine exception auslöst Und nochwas dazu...wie man sieht steht da 3mal "Error(1);" je nachdem ob irgendwas von den 3 if anweisungen nicht geklappt hat soll halt der fehler "1" an eine funktion übergeben werden....kann man das auch ohne das man es direkt jeder if anweisung im else teil angeben muss? also nur 1mal?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Exceptions

  Alt 19. Mai 2004, 05:22
Soviel ich weiß lösen WinAPI-Funktionen keine Exceptions aus, aber es gibt (meistens negative) Rückgabewerte, welche einen Fehler signalisieren. Mit Hilfe derer kannst du das Ganze steuern.
Bezüglich dem Error(1): Du könntest mit einer Booleanvariable arbeiten, aber ich verstehe nicht, was dich daran so stört.
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: Exceptions

  Alt 19. Mai 2004, 06:37
Ich vermute das Error() selber eine Exception auslösst, und somit wären die try finallys nötig.
Der Code ansich ist Bulletproof und meiner Meinung nach ein guter Source.

Gruß hagen
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#4

Re: Exceptions

  Alt 19. Mai 2004, 06:51
danke
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Exceptions

  Alt 19. Mai 2004, 07:27
Ich persönlich habe Bedenken deswegen:
Zitat von Pseudemys Nelsoni:
Delphi-Quellcode:
      if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, nil, nil, @dwLen) = ERROR_SUCCESS then
      begin
        Setlength(value, dwLen - 1);
Im PSDK wird gesagt, dass die benötigte Puffergröße in die dword-Variable geschrieben wird, wenn diese vorher mit einem Wert belegt war. Ob nun 0 oder 1, spielt keine Rolle. Das "NULL" im Text des PSDK entspricht ja dem "NIL" von Delphi:
Zitat:
If lpData is NULL, and lpcbData is non-NULL, the function returns ERROR_SUCCESS and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This enables an application to determine the best way to allocate a buffer for the value's data.
Da steht aber nicht so was wie
Zitat:
... and stores the size of the data, in bytes, in the variable [...] not including the last character
Ich würde den Puffer daher so lassen und bei Strings erst nach dem erfolgreichen Auslesen das letzte Zeichen entfernen. Oder evtl. prüfen ob das letzte Zeichen auch wirklich #0 ist.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: Exceptions

  Alt 19. Mai 2004, 07:35
PS:
Zitat von Pseudemys Nelsoni:
Und nochwas dazu...wie man sieht steht da 3mal "Error(1);" je nachdem ob irgendwas von den 3 if anweisungen nicht geklappt hat soll halt der fehler "1" an eine funktion übergeben werden....kann man das auch ohne das man es direkt jeder if anweisung im else teil angeben muss? also nur 1mal?
Du könntest intern mit einer bool-Variablen arbeiten, die du bei jedem Registry-Zugriff benutzt. Bspw.
Delphi-Quellcode:
boolRes := RegQueryValueEx(...) = ERROR_SUCCESS;
if(boolRes) then
begin
  { ... }
end;
Und am Ende, nach dem Schließen des Registryschlüssels, wertest du die Variable dann aus:
if(not boolRes) then Error(1); Und IMHO ist zumindest dieses try/except überflüssig:
Code:
  Try
    [color=red]Try[/color]
      { ... }
    [color=red]except
      Error(1);
    end;[/color]
  Finally
    RegCloseKey(KeyH);
  end
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#7

Re: Exceptions

  Alt 19. Mai 2004, 07:55
danke, besonders das letzte beispiel mit der booleschen variable hat mir geholfen
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Exceptions

  Alt 19. Mai 2004, 08:09
Ja, trotzdem noch eine Anmerkung: Du solltest die Typprüfung nicht vergessen:
Code:
if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, [color=red]nil[/color], nil, @dwLen)
Im Moment kann man mit der Funktion auch alles andere auslesen, also DWORDS usw., und nicht bloß Strings. Es passiert zwar nichts, aber man sieht natürlich auch bloß wieder die "Vierecke", weil es sich eben nicht um einen String handelt.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#9

Re: Exceptions

  Alt 19. Mai 2004, 08:28
danke, daran hatte ich (noch) nicht gedacht
Mario
MSN: cyanide@ccode.de
  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 22:02 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