Initialisierung in Try-Catch-Block legen !?
-
Halloda !
ich habe ein relativ großes Softwareprojekt fertiggestellt und benutze dabei eine Oracle-Datenbank. In der Hauptklasse importiere ich einige Klassen von Oracle
using Oracle.DataAccess.Client; using Oracle.DataAccess; using Oracle;
Diese drei Zeilen sind die ersten drei im gesamten Programm. Die Klassen befinden sich in einem speziellen Oracle-Treiber der extra installiert werden muss.
Ich möchte diese Anwendung jetzt mit einem Setup versehen damit ich es als EXE File auch auf anderen Rechnern installieren kann.
Beim ersten Start der Software auf einem fremden Rechner bekomme ich aber einen kritischen Fehler wenn dieser Oracle-Treiber nicht installiert ist.Ist es irgendwie möglich die Initialisierung irgendwie mit einem Try-Catch zu versehen ???
try{ using Oracle.DataAccess.Client; using Oracle.DataAccess; using Oracle; { catch{}
...funktioniert ja leider nicht :(:(
Ich würde dieses Problem gerne abfangen und dokumentieren !lG
Ranko
-
Das using ist nicht Auslöser deines Fehlers, denn es teilt dem Compiler nur mit, dass er Namen in diesen Namespaces aufzulösen hat. Für die using-Direktiven wird kein Code generiert.
-
Naja, dann sollte das Ganze aber zumindest die ersten Codezeilen durchlaufen und erst beim ersten Einsatz eines Oracle-Objektes abschmieren, oder ?
Er läuft aber nichtmal bis zum ersten Befehl (der per Streamwriter in ein Logfile schreiben soll und den dann wieder schließt) sondern bricht ab.
Komischerweise nur auf DEN Rechnern bei denen der Oracle-Treiber nciht installiert ist. Woran kann das sonst liegen ??
-
Naja, dann sollte das Ganze aber zumindest die ersten Codezeilen durchlaufen und erst beim ersten Einsatz eines Oracle-Objektes abschmieren, oder ?
Das ist nicht etwas, was du aus meiner Aussage folgern kannst. Was keinen Code generiert, kann auch nicht ausgeführt werden und zum Absturz führen, das stellen wir doch gleich mal als erstes fest. Das heißt natürlich nicht, dass er bis zu der Main kommen muss. Bevor deine Main() aufgerufen wird, passiert schon einiges im Hintergrund, die Assembly wird geladen, abhängige Assemblies werden gesucht ( <- hui, Achtung!), JIT-Compilierung durchgeführt, ein Main-Thread erstellt...
Komischerweise nur auf DEN Rechnern bei denen der Oracle-Treiber nciht installiert ist. Woran kann das sonst liegen ??
Du gibst dir selber die Antwort und im nächsten Satz stellst du die zugehörige Frage.
Du kennst doch das Problem, also installiere den Treiber. Ich sag' doch auch nicht, mein Programm benötigt Microsoft Windows, auf Rechnern ohne Windows läuft es aber nicht. Was mach ich jetzt?
-
darum gehts mir aber nicht - ich möchte diesen Fehler irgendwie abfangen und dem Benutzer, der diesen Treiber nicht installiert hat irgendwie zur Kenntniss bringen dass er den besser installieren sollte
vereinfacht:
if (!Treiber installiert) { MessageBox("Treiber installieren"); } else { main() }
Es geht da um meine Diplomarbeit und die werden einige Leute installieren wollen - da sollten keine kritischen Fehler ohne adäquate Fehlermeldung auftreten.
-
Kommt denn keine adequate Fehlermeldung wie FileNotFoundException? Du hast bisher immer nur von "abschmieren" gesprochen, aber so billig ist es normal nicht. Da man dein Programm sowieso installiert ist es das beste, den Treiber mit zu installieren. Also ich möchte nicht ein Programm installieren und dann beim Starten noch eine Meldung kriegen, die mich davon in Kenntnis setzt, dass ich irgendwo im Internet was suchen und runterladen und installieren muss. Stell dir vor, dieses Irgendwas würde das dann nochmal bringen, spätestens dann hätte ich meine Geduld verloren.
Naja lange Reder kurzer Sinn: Es wird noch kein von dir erstellter Code ausgeführt, wo das Ding sich schon verabschiedet, also bleibt dir nichts, außer im Manifest Abhängigkeiten ordentlich zu definieren (was aber normal automatisch passt) und bei der Installation schon für alles zu sorgen. btw. was studierst du eigentlich?
-
Du hast aber nicht statische Member, die schon vor der Main() instanziert werden, oder? Das ist nämlich der einzige Code, der noch vor Main() von dir ausgeführt wird. Wenn du sowas hast was schiefgehen kann, dann initialisiere sie nur in einem statischen Konstruktor. Aber ich denke eh nicht, dass das die Ursache ist.
-
es geht um eine spezielle Suchmaschine auf Datenbanken die irgendwann mal auf einem verteilten System laufen soll - zu 95% weiß der Admin natürlich was zu machen ist da die Installation nicht der einzige Schritt ist der bei der Installation zusätzlich durchzuführen ist.
Alle anderen Fehler sind aber ordentlich abgefangen und das ist wirklich der einzige Fall in dem ein kritischer Fehler auftreten kann. Ich weiß selber dass man in so einem Fall als Benutzer oft hilflos dasteht und keine Ahnung hat was man jetzt machen soll - das möchte ich einfach verhindern.
Die Fehlermeldung lautet übrigens:
ReportGenerator.exe Common Language Runtime Debugging Services Application has generated an exception that could not be handled. Process ID=0x14 (1300), Thread Id=0xe8(232) Click OK to terminate the application. Click CANCEL to debug the application.
und die ist ja wirklich nicht schön, oder ?
Wenn da steht "Oracle-Treiber fehlt" oder von mir aus auch "Fehlercode 12010" und das System danach kontrolliert schließt dann ist alles klar.Aber derzeit ist das irgendwie recht nervig
Studiere übrigens Informatik und bin kurz davor das Ding endlich abzugeben
-
ich kann ja nichtmal in der Registry nachschaun ob das Ding schon installiert ist da ich keine einzige Zeile Code ausführen kann
-
Du kannst eine Starter-Anwendung schreiben, die sowas erstmal testet. Das ist keine unübliche Vorgehensweise. Naja ich würde den Treiber in den Installer reinpacken und gut ist. Was soll denn dann noch schiefgehen?
Sorry, das soll jetzt echt nicht persönlich werden, aber wenn du Informatik studierst, dann solltest du doch wirklich wissen, was die using-Direktive macht und was sie vor allem nicht macht.
-
Informatik hat nicht zwingend viel mit Programmieren zu tun
C# hab ich mir eigentlich im Zuge von 2 Projekten selber beigebracht und mich natürlich hauptsählich um die Dinge gekümmert an denen ich gerade gearbeitet hab.und wie C# dann im Detail was lädt ist mir bisher verborgen geblieben