Entwickler-Ecke

Sonstiges (Delphi) - Fehlermeldungen ignorieren


slugg - So 27.01.08 13:54
Titel: Fehlermeldungen ignorieren
wie kann ich per delphi einen programmabsturz bzw ne fehlermeldung ignorieren? so das der user nichts mitbekommt?


Gausi - So 27.01.08 14:11

Gegenfrage: Wie kann ich einen Unfall auf der Autobahn ignorieren, so dass die Insassen nichts davon mitbekommen? ;-)


Yogu - So 27.01.08 14:15

@user profile iconGausi: Das ist was anderes. Eine Exception wird ausgelöst, wenn das Programm einen Unfall baut, und der Rechner bekommt zwangsläufig was mit. Dem User aber kannst du selenruhig erklären, was los ist.

Mit der try ... except-Struktur kannst du Fehler behaldeln. Du fügst in den try-Teil den Code ein, der eventuell Fehler enthalten kann, und in den except-Teil, das, was bei einem Fehler passieren soll. Wenn der User nicht informiert werden soll (empfiehlt sich nur bei vorrausgesehenen Fehlern, die man nicht behoben kriegt), lässt du den Teil einafach leer. Am Schluss steht noch ein end;.


Gausi - So 27.01.08 14:18

Fehlermeldung ok, aber einen Programmabsturz zu vertuschen ist wirklich nicht so gut ;-).

user profile iconYogu hat folgendes geschrieben:
(empfiehlt sich nur bei vorrausgesehenen Fehlern, die man nicht behoben kriegt)
Na, das ist ja toll. Wenn die Bremsen nicht funktionieren, lässt man den User einfach weiterfahren, weil man die nicht repariert bekommt, oder wie? :roll:


Yogu - So 27.01.08 14:24

user profile iconGausi hat folgendes geschrieben:
Wenn die Bremsen nicht funktionieren, lässt man den User einfach weiterfahren, weil man die nicht repariert bekommt, oder wie?

Nein. Man lässt den User aussteigen, lässt den Rechner gegen die Mauer fahren, holt ein neues Auto und setzt den User wieder rein. :mrgreen:

Ich habe zum Beispiel folgendes Problem:

Wenn ich einen Ordner lade, aber nicht weiß, ob der geschützt ist (z. B. System Volume Information), dann füge ich das in ein try...except ein.

Aber bitte keine Lösungsvorschläge!! (Es ist ein Moderator anwesend)


slugg - So 27.01.08 18:48

es geht um einen chat der auf einer datei basiert, bei mehreren leuten kanns vorkommen, dass die datei bereits in nutzung ist, das kann dem user eigentlich egal sein! der soll ja nur lesen können was der andere schreibt

mfg


BenBE - So 27.01.08 18:54

Kurzeinschätzung: Prinzip ist BRaindead by Design

Gerade für einen Chat sollte man lieber Sockets nehmen (entweder mit TCP oder UDP), aber KEINE Dateien, die über Netzwerk eh nicht vernünftig gelockt werden können. Kann man zwar indirekt über sog. LockFiles machen, aber für Braindead-Designs gibt es von meiner Seite keinen Support.

Narses hat für akzeptable Lösungen sehr gute Tutorials in der Library veröffentlicht. Les die doch einfach mal!


slugg - So 27.01.08 19:07

ich glaub ich hab vergessen zu sagen, dass ich delphi noob bin und wir gerade file speichern im unterricht (11. klasse info leistungskurs) dran haben, deshalb diese idee als projektarbeit ^^
soll nix besonderes werden, klar isses sinnlo ^^
wenn ic hsowas mach muss ich das auch an den unterricht anlehnen --> datei ^^
also gehts nur so ^^
das programm soll einfach nicht mit der meldung " zugriff nicht möglich; datei wird gerade verwendet" abstürzen ^^

mfg


BenBE - So 27.01.08 19:24

Einfach um die fehlerverursachenden Zeilen ein Try-Except drum rum machen und die geworfene Exception auswerten. Wenn nämlich ein anderer IO-Fehler auftritt, sollte der User ja sehr wohl noch darüber informiert werden, nicht wahr???

Die abztufangende Exception-Klasse ist IIRC EIOException oder eine abgeleitete Klasse davon. Die Syntax von Try Except findest Du recht anschaulich in der Delphi-Hilfe erklärt.


slugg - So 27.01.08 20:08

*nixblick*
kannst du das ins noobische übersetzen? :P


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls, ColorGrd;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Button2: TButton;
    Button3: TButton;
    Edit3: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Label4: TLabel;
    Label5: TLabel;
    Timer1: TTimer;
    RichEdit1: TRichEdit;
    ColorDialog1: TColorDialog;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var i:textFile;
d,user,k:string;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  d:=edit3.text;
  Richedit1.Lines.LoadFromFile(d +k);

  Richedit1.Perform(WM_VSCROLL, SB_BOTTOM, 0);
  label4.caption:=d;
  label5.Visible:=true;
  edit3.Text:='';
  timer1.enabled:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var a, e:integer;
begin
  d:=edit2.Text;
  AssignFile(i,d + k);
  rewrite (i);
  CloseFile(i);
  label4.caption:=d;
  label5.Visible:=true;
  edit2.Text:='';
  timer1.enabled:=true;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var e,a:integer;
begin
  AssignFile(i,d + k);
  append (i);
  e:=Memo1.Lines.Count;
  for a:=0 to e-1 do
    writeln (i, user + ' sagt: ' + memo1.Lines.Strings[a]);
  CloseFile(i);

  memo1.clear;

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
RichEdit1.Font.Color := ColorDialog1.Color;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Enabled:=false;

user:=edit1.Text;
end;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Richedit1.Lines.LoadFromFile(d + k);

  Richedit1.Perform(WM_VSCROLL, SB_BOTTOM, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
k:='.rtf';
end;

end.


das mein quelltext und da soll der "datei kann nicht ... bla" fehler ausgeblendet werden

mfg


BenBE - So 27.01.08 20:29

Sorry, aber ich spreche kein noobisch.

Vielleicht helfen Dir ja die Funktionen Einzelschritt, Haltepunkt und die ganzen anderen Werkzeuge, die Dir Delphi für die Fehlersuche bietet?

Außerdem bietet Delphi eine F1-Funktion.


slugg - So 27.01.08 21:43

naja als totaler anfänger isses halt schwer euch zu folgen, die schon ahnung haben ;)
da hab ich zb kein plan wo ich was machen soll usw... ^^ sry

ich versuch mich durchzubeißen!
wird schon ;)

edit: ich weiß ja gar nicht wo ich ansetzen soll... der fehler is ja extern hervorgerufen, eben wenn die datei gerade gelesen/beschrieben wird