myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » try/catch: Programmierstil
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Seiten (2): [1] 2 nächste » Antwort erstellen
Zum Ende der Seite springen  

try/catch: Programmierstil

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Red_Wraith
myCSharp.de-Mitglied

Dabei seit: 05.02.2006
Beiträge: 150


Red_Wraith ist offline

try/catch: Programmierstil

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich arbeite bei meinem Programmen relativ häufig mit try und catch.

Ist das eurer Meinung nach ein schlechter Programmierstil, weil man lieber den Code so ausfeilen sollte, dass gar keine Exceptions mehr möglich sind und man somit auf try und catch verzichten kann?
Oder sollte man doch lieber ein try und catch mehr setzen, als eins zu wenig zu haben und damit einen kompletten Programmabsturz bei Exceptions zu riskieren, mit denen man nicht gerechnet hat?

Haben try und catch einen negativen Einfluss auf die Performance?
19.07.2006 03:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
S.H.-Teichhof S.H.-Teichhof ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2460.jpg


Dabei seit: 03.10.2004
Beiträge: 1.549
Entwicklungsumgebung: #Developer
Herkunft: Sindringen


S.H.-Teichhof ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

try catch haben einen negativn einfluss vor allem wenn wirklich eine Expection geworfen wird. Aus Gründen der Proformanc solte man also versuchen das möglichst selten Expections geworfen werden(vor allem in Schleifen)

gruß Stefan

p.s Benutze auch mal die Forensuche da gibt es noch jede mange anderer Threads die sich mit dem Thema Beschäftigen
19.07.2006 07:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sorry, aber das ist vollständiger Quatsch, dass Exceptions langsam wären ... das ist so eine der unausrottbaren Urban Legends in der IT.

Exceptions haben keinen negativen Einfluss auf die Performance, und können von daher bedenkenlos genutzt werden. Für eine Erklärung, woher diese Urban Legend kommt, siehe  http://www.yoda.arachsys.com/csharp/exceptions.html

Abgesehen davon sollte eine Exception (wie der Name ja schon sagt) nur eine Ausnahme darstellen, und wenn die Software eh in einen Fehler läuft, wen juckt dann noch großartig die Performance? Die Fehlerbehandlung ist mit Sicherheit performancelastiger als das bissle, was try / catch verbraucht ;-).
19.07.2006 08:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
jan223 jan223 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2059.png


Dabei seit: 10.09.2004
Beiträge: 460
Entwicklungsumgebung: VS .Net 2003 2005
Herkunft: Bocholt / NRW


jan223 ist offline AIM Screenname von jan223: janmarkus223

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich frage zum Beispiel im Zweifelsfall die zu verwendene Variable auf NULL ab und reagiere vorher, als blind ins offene Messer zu laufen. Ich verwende Try und Catch so wenig wie möglich.
19.07.2006 08:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
frisch frisch ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1724.gif


Dabei seit: 18.08.2005
Beiträge: 2.083
Entwicklungsumgebung: VS C# 2005 Express
Herkunft: Coburg / Oberfranken


frisch ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich verwende try/catch ziemlich selten, und wenn doch, dann nur weil ich nicht weiß, wie ich den Fehler umgehen kann. Dann verwende ich aber gezielte catch wie z. B.

C#-Code:
catch(System.UnauthorizedAccessException ex) {
   //Gib eine Meldung aus.
}
19.07.2006 09:26 Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wobei ich als äußersten Block immer einen ganz allgemeinen Exceptionhandler verwenden würde, damit man im Zweifelsfall ein Log schreiben und sauber beenden kann. Das ist immer noch besser als ein Absturz.

Gerade in Threads kann das sehr wichtig sein, da sonst der Thread weg ist ...
19.07.2006 09:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Poweruser/ Experte

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In .NET ist man gezwungen an vielen Stellen Exceptions zu behandeln. Insofern stellt sich die Frage nach der Benutzung nicht. Die Frage ist höchstens, ob man innerhalb der Anwendung eigene Exceptions definiert und wirft.

Exception sind ja nicht umsonst eingeführt worden. Sie erlauben eine Fehlerbehandlung, die tendenziell mächtiger und auch weniger geschwätzig ist. Die Kosten einer Exceptionbehandlung (nach Auftreten!) sind allerdings nicht gering, so dass man Exception - wie Golo schon schrieb - eben nur für Ausnahmen verwenden sollte (meist dann, wenn der Code selbst eine Exception warf...).

Es gibt diverse Artikel im Netz, die sich mit Fehlerbehandlungsstrategien beschäftigen. Am besten mal einlesen.
19.07.2006 10:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo!

Ich erlaube mir hier mal eine Anmerkung (keine Ahnung, obs noch jemand liest Augenzwinkern ):

Die IDE hat doch schon eine Fehlerbehandlung, und zwar eine hervorragende!
Codestop, Meldung, Propertygrid zur Untersuchung auch der InnerException, Aufrufefenster zur Untersuchung der aktuell auffm Stack befindlichen Prozeduren, und's Lokalfenster zeigt alle geladenen Variablen.
- Das alles gibt man auf, indem man's mit einem trycatch deaktiviert.
Meist nur, um sich dieselbe Meldung in einer Messagebox anzugucken, und dann ohne die ganze vorgenannte Unterstützung.

Ein Fehler ist nunmal prinzipiell etwas unvorhergesehenes. Und das kann ein Programm nicht behandeln, das muß ein Mensch debuggen.

Und je unbehandelter der Fehler auftritt, desto leichter ist es, die Ursache herauszufinden, (trycatch fängt ja auch Fehler, die ganz woander aufgetreten sind).

Andersrum folgt daraus, dassich fleißig Fehler werfe, nämlich sobald ein ungültiger Zustand bemerkt wird. Eben je früher desto besser.

So als Gesichtspunkt.
Mit Error-Logging kenne ich mich nicht aus, und auch beim Multithreading (Golos Hinweis) ist Fehler fangen wohl besser als sie sich in Luft auflösen lassen.

Also mit einem gut durchdachten Gesamtkonzept im Hintergrund kann sich trycatch bestimmt durchaus nützlich machen.
Und dann gibts sichern Haufen Anwendungsfälle, an die ich jetzt nicht gedacht habe.
29.03.2008 16:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von ErfinderDesRades:
Hallo!
Die IDE hat doch schon eine Fehlerbehandlung, und zwar eine hervorragende!

Es geht doch vor allem aber auch darum, einen Fehler "graceful" behandeln zu können, wenn er beim Kunden auftritt, wo eben keine IDE da ist ... und ein try/catch stört die Fehlerbehandlung in der IDE auch nicht, lässt sich ja beides parallel nutzen.
29.03.2008 17:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ah. Das mit dem graceful für den Kunden kam nicht so raus, das hat natürlich seine Berechtigung.

Aber IDE-Fehlerbehandlung und trycatch paralell nutzen? - ich kenns halt so: trycatch eingebaut - nix mehr mit Codestopp und PiPaPo.

Wie nutzt man das paralell?
29.03.2008 17:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In VS 2005 z.B.:

Menü Debug > Exceptions > Break when an exception is thrown => Häkchen rein, und Du bekommst den Debugger nicht nur bei unbehandelten Exceptions, sondern bei jeder Exception ... kannst sogar einzelne Exceptiontypen einzeln aussuchen ;-)
29.03.2008 17:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

thx alot!

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Na, das hat sich ja doch wieder sehr gelohnt, dassich mich so unqualifiziert aussm fenster gehängt hab.

großes Grinsen
29.03.2008 17:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Gern geschehen :-)
29.03.2008 18:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Peter Bucher Peter Bucher ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2785.jpg


Dabei seit: 17.03.2005
Beiträge: 5.821
Entwicklungsumgebung: VS08
Herkunft: Zentralschweiz


Peter Bucher ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen

Hier noch zwei interessante Links zum Thema:
-  http://blog.waitz.biz/2007/03/02/EinPaar...behandlung.aspx
-  http://blog.norberteder.com/index.php?en...ry071001-093016 (Weitere Links im Beitrag)


Gruss Peter
29.03.2008 19:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
Rasta Rasta ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.09.2007
Beiträge: 258
Entwicklungsumgebung: Visual Studio 05 Prof.


Rasta ist offline Füge Rasta Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich nehme auch ziemlich oft try catch, oft auch, wenn ich ganz bewusst weiss, dass es ne Exception geben wird (ich gebe zu, das ist schlechter programmierstil, aber was solls).

Beispiel:

C#-Code:
try
            {
                do
                {
                    ListView_InfoBox.Items.Add(EF_ID_Feldnamen_nodelist.Item (i).Attributes.Item (0).InnerText).SubItems.Add (EF_ID_Daten[i]);
                    i++;
                } while (i != 45); //Die Schleife wird öfter durchlaufen als nötig, die leeren Einträge werden weg-gecatcht (quick n' dirty^2)
            }
            catch (Exception)
            { }

wie schon im kommentar steht: quick n dirty.
Durchschnittlich gibt es nur 30 Elemente (i=30), aber es werden immer 45 durchläufe gemacht. Das heisst, das Programm führt aus, was es soll, und läuft dann erstmal 15 mal gegen die wand, bevor es das macht, was es machen soll xD

mfg, Rasta
10.06.2008 15:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

und du siehst keine möglichkeit z.b. mit einer kopfgesteuerten schleife nur soviele durchläufe zu machen, wie notwendig sind?

übrigens ist es in deinem code so, das die schleife nach einem catch nciht wieder aufgerufen wird.

per definition ist eine ausnahme etwas, das im normalfall garnicht auftritt. in deinem fall ist es keine ausnahme, sondern ein logikelement, welches ein teures und unnötiges konstrukt ist. gerade in deinem code könnte ich mir mit nur ganz wenigen zeilen code mehr, vorstellen, das es sauberer, perfomanter und nachvollziehbarer geht.

ich z.b. vermeide solche konstrukte ala:
class1.method1(..).propertiecollection.method(...).propertie.nestedclass.method(...).ToString();

das ist nicht nur schwierig zu lesen. es ist auch ncoh umständlich zu debuggen.
die zeit, die du zum posten verwendet hast, hätte ausgereicht um den code glattzuziehen.

im übrigen würde jedes codereview dich bei solchen zeilen so richtig zerlegen. vor den augen des projektleiters, was dann gegenargumentationen schwierig macht....
10.06.2008 15:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Jo, findich eigentlich gut: Wenn man weiß was man macht, und dazuschreibt, dann kann man eigentlich so dreckig proggen, wie man will Augenzwinkern
Aber dein Beispiel scheint mir nicht gut gewählt:
Ich denke, die Schleife wird beim ersten Auftritt einer Exception verlassen, nicht wie das was du denkst. Und ein einfaches

C#-Code:
for(i=0; i<EF_ID_Feldnamen_nodelist.Count; i++){}

scheint mir nicht nur quickiger, sondern auch noch weniger dirty, odr?

[OT: Jack war schneller](... einen Chef darfs natürlich auch net geben ...)
10.06.2008 15:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rasta Rasta ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.09.2007
Beiträge: 258
Entwicklungsumgebung: Visual Studio 05 Prof.


Rasta ist offline Füge Rasta Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es gibt schon einen Chef, aber der interessiert sich nicht dafür. Ich werde das Prog auch nicht fertigschreiben können, das macht ein Kollege dann, der das ganze dafür aber dann lesen können muss.

Aber stimmt schon, es wird nur 1 mal gecatcht, danach gehts hinter der schleife weiter.
Wenn man das allerdings annimmt, ist das wegcatchen deutlich perfomanter als mehrere If's, die nur prüfen, ob die darauffolgende Bandwurmoperation möglich ist, denke ich. Diese Operation ist zwar schwer lang, erspart aber Zwischenvariablen. Mir wurde zwar mitgeteilt, dass die XML's, die ich einlesen soll, nur wenige KB haben, aber es geht hier um den Chip von Kredit/Debitkarten, und der wird ja bekanntlich immer größer und kann immer mehr. Deswegen hab ich mich gegen die Variante mit Variablen entschieden, und einfach Item und Subitem des Listviews in einer einzigen zeile hinzugefügt. Ich werd aber noch n Kommentar dranmachen.

mfg, Rasta (cu, feierabend)
10.06.2008 16:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Wenn man das allerdings annimmt, ist das wegcatchen deutlich perfomanter als mehrere If's, die nur prüfen, ob die darauffolgende Bandwurmoperation möglich ist, denke ich.

wenn man das annimt, dann stimmt das. jedoch ist es nicht so. nur weil das für dich weniger zeilen sind, heißt das nciht, das du keine komplexen mechanismen damit in gang setzt.

Zitat:
das macht ein Kollege dann, der das ganze dafür aber dann lesen können muss.

er wird sich in gedanken oft an dich erinnern.

Zitat:
Deswegen hab ich mich gegen die Variante mit Variablen entschieden

informationstechnisch ist die zeit der speicherkritischen pc-programmierung vergleichbar mit steinzeit und heute. die paar bytes, die du dadurch einsparst, gehen in einem wartbarkeits, dokumentations und debugging overhead unter.
10.06.2008 16:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 47.568
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Rasta,

mich mutet dein Stil schon etwas - sagen wir - exotisch an. Ich verstehe ehrlich gesagt nicht, was du daran findest. quick'n'dirty bedeutet doch, dass man etwas schmutzig macht um schneller zu sein (also weniger Programmieraufwand zu haben). Das ist doch in deinem Beispiel gar nicht der Fall. Es ist schmutzig und weniger schnell. Insgesamt kann ich deiner Vorgehensweise nicht empfehlenswertes abgewinnen.

herbivore
10.06.2008 17:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie heißt es so schön:

"The problem with quick and dirty is that dirty remains while quick is long gone."
10.06.2008 19:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Jabe
myCSharp.de-Mitglied

Dabei seit: 27.05.2008
Beiträge: 57
Entwicklungsumgebung: VS08 Team System


Jabe ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Golo Roden:
Sorry, aber das ist vollständiger Quatsch, dass Exceptions langsam wären ... das ist so eine der unausrottbaren Urban Legends in der IT.

Exceptions haben keinen negativen Einfluss auf die Performance, und können von daher bedenkenlos genutzt werden. Für eine Erklärung, woher diese Urban Legend kommt, siehe  http://www.yoda.arachsys.com/csharp/exceptions.html

Und?  Mal weitergelesen? Der Microbenchmark ist absoluter Quatsch.

Was ich sagen möchte, deine Aussage mit "bedenkenlos benutzten" ist gefährlich. Siehe den Flow-Control-Horror von Rasta. unglücklich
Wenn man kann vermeidet man die Exception. Lieber ein TryParse als ein Parse mit Try! Defensive Asserts (if x != null) und Debug.Assert können da helfen.

Zitat von http://blogs.msdn.com/ricom/archive/2003/12/19/44697.aspx:
Almost Rule #1

When deciding if you should throw an exception, pretend that the throw statement makes the computer beep 3 times, and sleep for 2 seconds.

Agreed. Genau so kann man das beschreiben.
10.06.2008 19:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du kannst Exceptions bedenkenlos einsetzen, wenn Du sie als das einsetzt, was sie dem Namen nach sind: Ausnahmen.

Exceptions sollten NICHT zur Implementierung normaler Anwendungslogik genutzt werden.
10.06.2008 21:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Basti LE Basti LE ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2604.jpg


Dabei seit: 05.12.2007
Beiträge: 29
Entwicklungsumgebung: Visual Studio 2008
Herkunft: Stade


Basti LE ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

ich verwende try/catch meist als äußeren Rahmen in meinem Methoden, um dem Benutzer, im Fall der Fälle, ordentliche und angepasste Fehlermeldungen geben zu können. Ansonsten versuche ich immer Exceptions durch sinnvolle Prüfungen alla if(... != null) abzufangen. Das ist Performant und Übersichtlich.
10.06.2008 22:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 8 Monate.
sonnendeck2000 sonnendeck2000 ist männlich
myCSharp.de-Mitglied

Dabei seit: 13.10.2008
Beiträge: 42
Entwicklungsumgebung: Visual Studio 2008, .Net CF
Herkunft: Trier


sonnendeck2000 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo.

Auch wenn dieser Thread schon etwas älter ist, denke ich das meine Frage gut hier hinein passt. Ich habe mich mit google und hier Forum schon umgeschaut und nichts wirklich gefunden.

Ich habe ein try-catch Konstrukt in einer while-Schleife, da ich nach der exception weiterlaufen muss. Mir gefällt das aber nicht wirklich, da es unperformant ist und die while-Schleife schonmal 200.000(oder mehr) Durchläufe haben kann.

C#-Code:
while (pEnumerator.MoveNext())
{
    try
    {
        // do something
    }
    catch (UnauthorizedAccessException e)
    {
         // do something
    }
}

Kann man das eleganter lösen?
17.02.2009 14:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Kann man das eleganter lösen?

laut anforderung ist das die korrekte lösung.
eine andere möglichkeit wäre, immer die rechte zu prüfen um die exception zu vermeiden aber ich behaute jetzt mal das das abprüfen unperfomanter ist als das try-catch konstrukt.
17.02.2009 14:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
winSharp93 winSharp93 ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-2918.png


Dabei seit: 19.01.2007
Beiträge: 5.711
Entwicklungsumgebung: VS 2010 Professional
Herkunft: Freiburg / Stuttgart


winSharp93 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von sonnendeck2000:
Mir gefällt das aber nicht wirklich, da es unperformant ist

Aber nur, wenn tatsächlich Exceptions auftreten.
Und das sollte nicht der Regelfall sein.
17.02.2009 14:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
sonnendeck2000 sonnendeck2000 ist männlich
myCSharp.de-Mitglied

Dabei seit: 13.10.2008
Beiträge: 42
Entwicklungsumgebung: Visual Studio 2008, .Net CF
Herkunft: Trier


sonnendeck2000 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nein ist es zum Glück auch nicht. Ich danke für eure Antworten. War mir nicht sicher ob ich was übersehe.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von sonnendeck2000 am 17.02.2009 15:02.

17.02.2009 15:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Über die UnauthorizedAccessException binnich auch schon schier verzweifelt.
Ich hab nicht rausgefunden, wie man die Rechte abprüft, und unter Vista, oder überhaupt, wenn man nicht als Admin im Dateisystem unterwegs ist, ist diese Ausnahme durchaus ein Normalfall.
Mir scheints da am Design z.B. der DirectoryInfo-Klasse zu fehlen, daß die nicht angeben kann, ob Zugriff möglich oder nicht.
Oder gleich ein GetDirectories(), welches nicht-zugreifbare gleich ausspart.
17.02.2009 20:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Poweruser/ Experte

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zugreifbar ist unter Windows so eine Sache. Es gibt so um die 20 Zugriffsrechte:

 MSDN: FileSystemRights Enumeration

Vielleicht hilft das als Einstieg ins Thema:

C#-Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;


namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileObject = @"\Windows\Microsoft.NET\Framework\";
            FileSecurity sec = File.GetAccessControl(fileObject);
            AuthorizationRuleCollection authCol = sec.GetAccessRules(true, true, typeof(NTAccount));

            WindowsIdentity myAccount = System.Security.Principal.WindowsIdentity.GetCurrent();
            Console.WriteLine("Mein Account = " + myAccount.Name.ToString());
            Console.WriteLine(string.Format("\r\nRechte in {0}\r\n", fileObject));
            foreach (IdentityReference group in myAccount.Groups)
            {
                foreach (FileSystemAccessRule rule in authCol)
                {
                    if (group.Translate(typeof(NTAccount)) == rule.IdentityReference)
                    Console.WriteLine(string.Format("Recht {0} über User/Gruppe {1}", rule.FileSystemRights, rule.IdentityReference.Value));
                }
            }
            Console.ReadLine();
        }
    }
}

Aber: Du bekommst auch in diesem Fall eine SecurityException, wenn du keine Lese-Rechte auf dem Objekt hast. Grundsätrzlich kannst du auf Exceptionbehandlung sowieso nicht verzichten. Du kannst bestenfalls einen Großteil der Exceptions vermeiden.

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von svenson am 18.02.2009 00:36.

18.02.2009 00:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
kleines_eichhoernchen kleines_eichhoernchen ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2079.jpg


Dabei seit: 07.11.2006
Beiträge: 3.971
Entwicklungsumgebung: Visual Studio 2005 (C#)
Herkunft: Ursprünglich Vogtland, jetzt Much


kleines_eichhoernchen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Kann man das eleganter lösen?

Arbeite die Liste asynchron ab.
18.02.2009 08:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Haggy Haggy ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2608.png


Dabei seit: 22.03.2004
Beiträge: 1.131
Entwicklungsumgebung: VFP, C#, AFP,.NET,C#, VS2005
Herkunft: Kaiserslautern


Haggy ist offline Füge Haggy Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich bin da voll und ganz Golos Meinung

Wenn man Exceptions richtig verwendet gibt es keine Probleme.

Wichtig ist aber auch dass man Exceptions gezielt abfängt

wenn man z.Bsp. weiß, dass eine UnauthorizedAccessException geworfen werden könnte dann sollte man auch konkret diese abfangen und nicht generell Exception.

Ansonsten bekommt man andere Fehler vielleicht garn icht mehr mit?
Man sucht stundenlang nach fehlenden Rechten und dann ist es eine NullRefEx.....

Im allgemeinen verfahre ich so dass eine Methode Möglichst restriktiv Exceptions wirft (jeder Para und zustand wird geprüft). DEr Aufrufer kümmer sich aber darum das alle Paras gültig sind, falls nicht sorgt er schon für ein ausnahme handling bevor der aufruf erfolgt.

So bekommt ein Entwickler direkt feedback wenn eine Komponente falsch / unvorhergesehen verwendet und in der letztendlcihen runtime treten (fast) keine solcher expcetions mehr auf
18.02.2009 08:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@svenson:
Jo, das ist genau der part, den ich nie gebacken gekriegt habe.

MultiThanx! smile
18.02.2009 13:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Haggy: So mache ich das idR. auch. Fast jede Methode bei der ich mir nicht zu Hundert Prozent sicher bin das nur ich sie benutze (also eigentlich jede public Methode) hat einen Block von Parameterprüfungen die alle gezielte Exceptions werfen. Eine Suche nach "throw new" bringt in meinem Programmen meist viele hundert Ergebnisse. Augenzwinkern

Anders ist es in einer Projektarbeit auch garnicht möglich da ich anderen Entwicklern nicht zumuten kann meinen Code zu verstehen wenn mal ein Parameter falsch sitzt.
Und wenn ich da mit Rückgabecodes (ausser null) arbeiten würde hätte ich wohl bald den Unmut sämtlicher Kollegen auf mich gezogen. Magic Numbers sind hier nicht sonderlich beliebt - und das imho zu Recht.

Ebenso behandle ich zur Entwicklungszeit das Abfangen der Excpetions - grundsätzlich kriegt fast jede Methode erstmal einen allgemeinen try..catch verpasst. Nachdem die Applikation das tut was sie soll gehe ich via FxCop und StyleCop durch die Assembly und schmeisse alle Blöcke wieder raus bzw. ersetze sie wo nötig durch gezieltes ExceptionHandling.
18.02.2009 13:17 Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von LuckyGeorge:
Ebenso behandle ich zur Entwicklungszeit das Abfangen der Excpetions - grundsätzlich kriegt fast jede Methode erstmal einen allgemeinen try..catch verpasst. Nachdem die Applikation das tut was sie soll gehe ich via FxCop und StyleCop durch die Assembly und schmeisse alle Blöcke wieder raus bzw. ersetze sie wo nötig durch gezieltes ExceptionHandling.

Versteh ich nicht - Ich empfehle immer die genau gegenteilige Vorgehensweise.  AvoidTryCatch
Also zur Entwicklungszeit, und bis die Applikation ungefähr das tut was sie soll, genau keine TryCatchens, weil die Fehlerbehandlung der IDE zum Entwickeln die bestmögliche überhaupt ist.
Erst ganz am Schluß, wenn man überhaupt ein Konzept haben kann, wies nach einem Fehler weitergehen soll, und wenn die Möglichkeiten ausgeschöpft sind, TryCatch durch Abprüfen des Kontextes zu vermeiden, dann spendier ich mal einen.
18.02.2009 13:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ich sehe das genau so wie ErfinderDesRades und praktiziere es auch so.
18.02.2009 13:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.523


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@LuckyGeorge:
In de SW Entwicklung ist nichts so beständig wie das Provisorium, deshalb
wird dein ansatz dazu führen, das du die Exceptions manchmal nicht entfernst,
und dann hast Du das Problem.

Also lieber gleich die richtigen einbauen.
18.02.2009 13:57 Beiträge des Benutzers | zu Buddylist hinzufügen
Peter Bucher Peter Bucher ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2785.jpg


Dabei seit: 17.03.2005
Beiträge: 5.821
Entwicklungsumgebung: VS08
Herkunft: Zentralschweiz


Peter Bucher ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen

Zitat von JAck30lena:
ich sehe das genau so wie ErfinderDesRades und praktiziere es auch so.

Ich ebenso.


Gruss Peter
18.02.2009 14:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von ErfinderDesRades:
Zitat von LuckyGeorge:
Ebenso behandle ich zur Entwicklungszeit das Abfangen der Excpetions - grundsätzlich kriegt fast jede Methode erstmal einen allgemeinen try..catch verpasst. Nachdem die Applikation das tut was sie soll gehe ich via FxCop und StyleCop durch die Assembly und schmeisse alle Blöcke wieder raus bzw. ersetze sie wo nötig durch gezieltes ExceptionHandling.

Versteh ich nicht - Ich empfehle immer die genau gegenteilige Vorgehensweise.  AvoidTryCatch
Also zur Entwicklungszeit, und bis die Applikation ungefähr das tut was sie soll, genau keine TryCatchens, weil die Fehlerbehandlung der IDE zum Entwickeln die bestmögliche überhaupt ist.
Erst ganz am Schluß, wenn man überhaupt ein Konzept haben kann, wies nach einem Fehler weitergehen soll, und wenn die Möglichkeiten ausgeschöpft sind, TryCatch durch Abprüfen des Kontextes zu vermeiden, dann spendier ich mal einen.

Hmm, leider habe ich trotz mehrjähriger Tätigekit noch nicht die Erfahrung zu wissen, welche Exceptions meine Methoden werfen können bevor die Methode fertig ist. Deshalb bin ich bisher mit meinem Ansatz recht gut gefahren.
Und so gut ist die Fehlerbehandlung der IDE auch nicht - wenn ich den try Catch Block weglasse fliegen mir manche Exceptions erst im Haupthread - dann muss ich aufwendig durch die Aufrufliste gehen um festzustellen wo eigentlich der Unsinn passiert ist. Ein simples try...catch um die Methode und dann eine Consolen bzw. Tracer Ausgabe und schon was ich was, wann und wo passierte. Aber gut - jeder hat halt seinen Stil.

@FZelle: Es mag sein, daß es an meiner Tätigkeit als Freelancer liegt - aber bisher waren in jedem Projekt mindestens die letzten 2 Wochen eines Projektes für Dokumentation und Aufräumen vorgesehen. Und die lasse ich mir nicht nehmen egal, wie sich der Kunde anstellt. Die Konsequenz wäre sonst das ich vor lauter Anrufen von Altkunden nicht mehr zum arbeiten komme.
Abgesehen davon habe ich auch während der Projektlaufzeit immer wieder mal einen Hänger bei dem ich nicht weiss wie ich nun den nächsten Schritt am besten anfange - das ist dann perfekte Zeit für den FXCop.

Es mag sein (und ist auch wahrscheinlich), daß auch mal ein try...catch Block übersehen wird. Dieser tut dann idR. aber keinem weh, da er sich nur an einer unkritischen Stelle befinden kann. Sämtliche Zeitfressenden Routinen werden bereits zur Entwicklungszeit weitesgehend optimiert. Also sehe ich da kein Problem.

Es ist halt meine Erfahrung - und die ist ja definitionsgemäß bei jedem anders - das ungewöhnliche Programmabstürze, GUI Hänger oder ein nicht gewolltes Laufverhalten fast immer darauf zurückzuführen sind das eine Exception nicht oder nur unzureichend abgefangen wurde.

Und auch wenn ich hier eine Mehrheit sehe, die das anders handhabt - ich denke mir halt, daß das Framework nicht nur deswegen bei jedem noch so kleinen Fehler eine Exception wirft damit wir im VS eine schöne volle Console haben sondern damit wir darauf reagieren können. Der Performanceverlust innerhalb des Frameworks durch das Werfen der Exception ist doch eh schon da - da macht das Abfangen derselben den Kohl nicht mehr fett.
18.02.2009 15:23 Beiträge des Benutzers | zu Buddylist hinzufügen
winSharp93 winSharp93 ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-2918.png


Dabei seit: 19.01.2007
Beiträge: 5.711
Entwicklungsumgebung: VS 2010 Professional
Herkunft: Freiburg / Stuttgart


winSharp93 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

Zitat von JAck30lena:
ich sehe das genau so wie ErfinderDesRades und praktiziere es auch so.

Dito.

Zitat von LuckyGeorge:
Und so gut ist die Fehlerbehandlung der IDE auch nicht - wenn ich den try Catch Block weglasse fliegen mir manche Exceptions erst im Haupthread - dann muss ich aufwendig durch die Aufrufliste gehen um festzustellen wo eigentlich der Unsinn passiert ist.

NEIN!!!
Du kannst einfach unter "Debugging - Exceptions" festlegen, bei welchen Exceptions auch unterbrochen werden soll, wenn diese geworfen werden.
Das "Hangeln" durch den Callstack ist auf diese Weise eigentlich nur selten notwendig.
18.02.2009 15:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 6 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 19.06.2013 04:21