Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Raise, welche Anwendungsgebiete? (https://www.delphipraxis.net/44615-raise-welche-anwendungsgebiete.html)

Keex 21. Apr 2005 17:29


Raise, welche Anwendungsgebiete?
 
Hallo,

habe mal eine Frage zu Raise. Der einzige SInn der mir bisher aufgefallen ist, ist der dass durch raise eine schöne Messagebox ausgegeben wird und die ausführung des codes gleichzeitig an dieser stelle unterbrochen werden kann.

ist das der einzige Grund wozu man Raise benutzen kann, oder hab ich was übersehen?

Suchfunktion hat leider nicht wirklich geholfen.


Danke schonmal. Gruß
Keex

Dax 21. Apr 2005 17:31

Re: Raise, welche Anwendungsgebiete?
 
raise wird benutzt um Delphi-Referenz durchsuchenExceptions zu "werfen". Exceptions sind da, um bei kritischen Fehlern den Code an dieser Stelle zu unterbrechen und den Fehler zu verarbeiten. Wird der Fehler nicht verarbeitet (die VCL macht das aber immer), stürzt dein Programm ab.

Keex 21. Apr 2005 17:38

Re: Raise, welche Anwendungsgebiete?
 
jau, was raise macht und ist ja klar. aber wozu benutze ich es? weil so wie du es beschreibst würde es nur dazu da sein es vor anweisungen zu schreiben, bei denen man 100% weiss das sie dein programm crashen...das kann ja nicht sinn der sache sein ;)

Dax 21. Apr 2005 17:42

Re: Raise, welche Anwendungsgebiete?
 
Na ja, so ist es nicht. Stell dir einfach vor du schreibst eine Unit, die einen Wert berechnet. Sagen wir, der Wert liegt immer zwischen -1 und 1. Jetzt stellt sich bei der Berechnung heraus, das der Wert ungefähr 8254 ist. In dem Fall könntest du raise benutzen um dem Nutzer der Unit mitzuteilen, das etwas katastrophal schief gelaufen ist. Sieh dir dazu am besten ein Exception-Tutorial an ;-)

Waldteufel 21. Apr 2005 17:42

Re: Raise, welche Anwendungsgebiete?
 
Hi.

Mal ein Anwendungsbeispiel:

Delphi-Quellcode:
procedure Fehleranfaellig;
var
  i, j : integer;
begin
  try
    i := 0;
    j := i div 12;
  except
    ShowMessage('Du hast wohl in Mathe nicht aufgepasst... Durch 0 kann nicht geteilt werden...');
    raise;
  end;
end;

procedure Fehler;
begin
  try
    Fehleranfaellig;
  except
    ShowMessage('Da hat einer den Code verhunzt!!!');
    raise;
  end;
end;

procedure Test;
begin
  try
    Fehler;
  except
    ShowMessage('Mist...');
  end;
end;

tommie-lie 21. Apr 2005 17:46

Re: Raise, welche Anwendungsgebiete?
 
Zitat:

Zitat von Keex
jau, was raise macht und ist ja klar. aber wozu benutze ich es? weil so wie du es beschreibst würde es nur dazu da sein es vor anweisungen zu schreiben, bei denen man 100% weiss das sie dein programm crashen...das kann ja nicht sinn der sache sein ;)

Exceptions lassen sich wörtlich übersetzen, sie sind Ausnahmefehler. Stell dir vor du schreibst eine Klasse zum Datenbankzugriff und du merkst, daß dein Datenbankserver nicht mehr da ist. Dann wirfst du eine Exception, weil er eigentlich da sein sollte. Der Anwender deiner Klasse sollte in entsprechenden try-Blöcken die Exceptions abfangen und sinnvolle Fehlermeldungen ausgeben.
Der Sinn von Exceptions ist nicht, das Programm abstürzen zu lassen (das tun sie schließlich auch nur, wenn der Programmierer keine Ahnung hatte), sondern Fehler direkt zu melden, ohne daß vor der Verarbeitung des Fehlers weitergearbeitet wird.

Ein Beispiel ist die EAccessViolation. Irgendwo hast du auf Speicher zugegriffen, der definitiv nicht dazu bestimmt war, von dir zugegriffen zu werden. Nachfolgender Code (der evtl irgendwas mit dem Speicher macht) darf dabei auf keinen Fall ausgeführt werden, also löst die RTL eine Exception aus und benachrichtigt dich damit, daß in deinem Code irgendwo etwas mächtig schief geht. Derartige Fehlermeldungen solltest du abfangen, schön verpacken (lokalisierte Fehlermeldung, die ein Benutzer auch versteht), und dem Benutzer mitteilen, damit er gegebenenfalls einen Bugreport zurückschicken kann.


Edit:
Zitat:

Zitat von Waldteufel
Delphi-Quellcode:
  try
    i := 0;
    j := i div 12;
  except
    ShowMessage('Du hast wohl in Mathe nicht aufgepasst... Durch 0 kann nicht geteilt werden...');
    raise;
  end;

Es wird doch auch gar nicht durch 0 geteilt :mrgreen:

Edit2: :shock: sind ja untypisierte Exceptions! Überlichweise nimmt man da typisierte exceptions und das ShowMessage() überlässt man dem Caller.
Edit3: C++ und Delphi sollte man nicht mischen, auch wenn's verführerisch ist :mrgreen:
Immerhin ist die Anwendung unüblich ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz