Try-catch jede Zeile code, ohne die einzelnen try-catch-Blöcken
Ich nicht haben derzeit dieses Problem, aber man weiß ja nie, und dachte, Experimente sind immer Spaß.
Ignorieren der offensichtlichen Probleme, die Sie mit Ihrer Architektur sogar dem Versuch, diese, mal angenommen, Sie waren einige schrecklich geschriebenen code von jemand anderem design, und Sie brauchte ein paar große und abwechslungsreiche Operationen in den gleichen code-block, z.B.:
WidgetMaker.SetAlignment(57);
contactForm["Title"] = txtTitle.Text;
Casserole.Season(true, false);
((RecordKeeper)Session["CasseroleTracker"]).Seasoned = true;
Multipliziert mit hundert. Einige dieser arbeiten könnte, der andere könnte gehen schlecht. Was Sie brauchen, ist die C# - Entsprechung von "on error resume next", sonst wirst du am Ende kopieren und einfügen versucht-Fänge um die vielen code-Zeilen.
Wie würden Sie versuchen, dieses problem anzugehen?
Ich Liebe, wie niemand die Frage beantwortet. sondern versucht, die 'richtige' Art und Weise. seine Hand, die er nicht wollen, dass. Gotta have soime Vertrauen in die Menschen, dass Sie wissen, was Sie tun, manchmal, vor allem, wenn es wurde erklärt, wie es war, meine Güte.
Das ist lustig! Also das nächste mal jemand fragt, "hey, wie kann ich den code ein Speicherleck?" Jeder sollte nur erläutern und nicht abraten? Auch, da er vor allem die Frage "wie würden SIE versuchen, dieses problem anzugehen?" Klingt wie bittet er um Stellungnahme.
Sie Jungs sind genial. Ich bin gefragt "was soll ich tun, wenn ich jemals finden mich hängen von einer Klippe", und Ihre Antwort ist: "Sie sollten nicht immer hängen von einer Klippe". Ignorieren der Punkt warum nicht Sie!
Nicht Christoph Kolumbus, Kein Segel, so weit Sie fallen über den Rand der Welt!
InformationsquelleAutor tags2k | 2008-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ziemlich offensichtlich, dass, würde man den code schreiben VB.NET, die tatsächlich On Error Resume Next, und exportieren Sie es in eine DLL für C#. Alles andere ist nur ein Fresser
für die Strafe.
InformationsquelleAutor Mark Brackett
Als der .net 3.5, die Sie verwenden können, Handeln statt voidDelegate.
Ich Liebe es! Diese ist wie immer der @ - operator aus PHP in C#. php.net/manual/en/language.operators.errorcontrol.php Und ich habe nicht zu schreiben, diese Frage.
Wie kommt Aktion funktioniert auch hier, auch wenn Sie beginnen, die übergabe von Parametern? Ist der compiler, der Umgang mit diesem für Sie... wie ignorieren oder fallenlassen der params?
Das große problem hier ist die "catch {}" fangen Dinge, die sollten nie gefangen werden, einschließlich low-level-Fehler in den Zustand der CLR.
InformationsquelleAutor Lost Plugin Writer
Umgestalten in einzelne, gut benannte Methoden:
Jeder von denen ist angemessen schützen.
InformationsquelleAutor plinth
Ich würde sagen nichts tun.
Jup das ist Recht, NICHTS zu tun.
Haben Sie eindeutig identifiziert werden, zwei Dinge zu mir:
Ich sagen:
Haben Sie dies geklärt, in kürzester Zeit, wenn es so schlecht ist. Ja, ich weiß, es klingt sucky, und Sie können ziehen Sie Ihre Haare mit bugfixes zu beginnen, aber es wird Ihnen erlauben, fix die Bedürftigen/buggy-code vor die (große) Menge von code, der eigentlich funktionieren egal wie beschissen es aussieht.
Sobald Sie anfangen, den Krieg zu gewinnen, Sie haben einen besseren Griff auf den code (durch alle Ihre refactoring) Sie haben eine bessere Idee für ein ansprechendes design.
Versuchen, wickeln Sie alles in bubble wrap ist wahrscheinlich nur eine lange zu tun, und Sie immer noch nicht näher an die Lösung der Probleme.
InformationsquelleAutor Rob Cooper
Scheitern Schnell
Ausarbeiten, ich glaube, ich bin zu hinterfragen die Frage. Wenn eine Ausnahme ausgelöst wird, warum würden Sie wollen, Ihren code einfach weiter, als wenn nichts passiert wäre? Entweder Sie erwarten, dass die Ausnahmen in bestimmten Situationen, in dem Fall schreiben Sie einen try-catch-block, um den code ein und behandeln Sie Sie, oder es ist ein unerwarteter Fehler, in diesem Fall sollten Sie es vorziehen, Ihre Anwendung abzubrechen, oder versuchen Sie es erneut, oder nicht. Tragen nicht auf wie ein verwundetes zombie Stöhnen 'Gehirn'.
InformationsquelleAutor Matt Howells
Dies ist eines der Dinge, die mit einem Präprozessor ist nützlich für die. Definieren Sie ein makro, die Schwalben Ausnahmen, dann mit einem schnellen script-fügen Sie das makro für alle Zeilen.
So, wenn das C++ ist, konnten Sie etwas wie dieses:
Leider nicht viele Sprachen gehören offenbar einem Präprozessor wie in C/C++ haben.
Könnte man erstellen Sie Ihre eigenen Präprozessor und fügen Sie es als pre-build-Schritt. Wenn du das Gefühl vollständig zu automatisieren, es könnte wahrscheinlich schreiben ein Präprozessor, der würde die eigentlichen code-Datei und fügen Sie die try/catch-Zeug auf Ihrem eigenen (so dass Sie nicht haben, um diejenigen hinzuzufügen, die VERSUCH() blockiert, um den code manuell eintragen). Sicher, dass es nur geänderte Zeilen soll es schwierig sein könnte, obwohl (überspringen Variablen Deklarationen, Schleifen-Konstrukte, etc., dass Sie nicht brechen die bauen).
Allerdings denke ich, dass diese schrecklichen Ideen und sollte nie getan werden, aber die Frage die gestellt wurde. 🙂
Wirklich, Sie sollten nicht immer tun. Sie müssen feststellen, was verursacht die Fehler und korrigieren Sie es. Schlucken/ignorieren von Fehlern ist eine schlechte Sache zu tun, so dass ich denke, dass die richtige Antwort ist hier "den Fehler Beheben, nicht ignorieren!". 🙂
Das problem ist das immer noch nicht funktionieren würde, wie vorgesehen, zumindest nicht, ohne einige weitere zu denken. Wenn Sie dies tun, dann ist es fast garunteed Sie gehen Variablen aus dem Rahmen und brechen Sie Ihre bauen.
Das ist, warum ich sagte, Sie müssen vorsichtig sein, zu überspringen, Variablen-Deklarationen, zusammen mit anderen Dingen.
Selbst wenn Sie nicht brechen, Ihr zu bauen, das wäre hart, es gibt eine Tonne von Zeug, um wirklich zu sehen, für die nicht nur die Deklarationen von Variablen und Schleifen-Konstrukten. Ich weiß, Sie sind darauf hindeutet, dass er tatsächlich gehen mit ihm durch (ganz im Gegenteil).
Aber das ist nur, was macht versuchen, ein tool schreiben für diesen Spaß! (oder unglaublich schmerzhaft). 🙂
InformationsquelleAutor Herms
On Error Resume Next
ist eine wirklich schlechte Idee in der C# - Welt. Noch würde hinzufügen, das äquivalent zurOn Error Resume Next
tatsächlich helfen Sie. Alle es tun würden, lassen Sie in einem schlechten Zustand, was dazu führen mehr subtile Fehler, Verlust von Daten und eventuell Daten beschädigt werden.Sondern um dem Fragesteller seinen wegen, man könnte hinzufügen, ein globaler handler und überprüfen Sie die TargetSite, um zu sehen, welche Methode geschlafen. Dann könnte man wenigstens wissen, welche Linie es geschlafen. Der nächste Teil wäre, zu versuchen und herausfinden, wie du den "nächste Anweisung" die gleiche Weise mit dem debugger funktioniert es. Hoffentlich ist dein stack nicht haben, schlängelte sich an dieser Stelle oder Sie können neu erstellen, aber es ist sicherlich einen Versuch Wert. Jedoch, dieser Ansatz würde der code zum ausführen im Debug-Modus jedes mal so, dass Sie Ihre debug-Symbole enthalten.
InformationsquelleAutor Orion Adrian
Als jemand erwähnt, VB erlaubt. Wie es zu tun die gleiche Weise in C#? Geben Sie treuen Reflektor:
:
Übersetzt in:
refactoring ist ein großes Ziel, aber es gibt Zeiten, die Sie haben zu halten den ganzen Schlamassel laufen, während Sie überholung. Benutzer hassen es, wenn Sie Ihre Daten verlieren aufgrund einer unbehandelten Ausnahme beendet die Anwendung. Sie zeigen Sie nicht der Narr, der schrieb, machte das Chaos, aber die Entwickler jetzt verantwortlich.
InformationsquelleAutor Christopher Elliott
Den code neu schreiben. Versuchen Sie finden Sätze von Aussagen, die logisch voneinander abhängen, so dass wenn einer ausfällt, dann die nächste, keinen Sinn machen, und hive Sie ab in Ihre eigenen Funktionen und setzen versuchen-Fänge um Sie, wenn Sie wollen, ignorieren Sie das Ergebnis, und weiter.
InformationsquelleAutor Khoth
Dies kann helfen Ihnen bei der Identifizierung der Stücke, die haben die meisten Probleme.
@ JB King
Danke für die Erinnerung. Der Logging application block hat eine Instrumentierung Fall, dass kann verwendet werden, um trace-Ereignisse finden Sie weitere Informationen über die MS Enterprise library docs.
Alle Schritte, die in dieser Verwendung wird verfolgt, um eine log-Datei, und Sie können analysieren, um zu sehen, wo die log-Pausen (ex geworfen wird) und id die hohe Straftäter.
Refactoring ist wirklich Ihre beste Wette, aber wenn Sie haben eine Menge, das kann Ihnen helfen, lokalisieren die schlimmsten.
InformationsquelleAutor StingyJack
Du könnte Verwendung springen, aber es ist immer noch chaotisch.
Habe ich wollte eigentlich eine Art single-Anweisung, try-catch für eine Weile. Es würde hilfreich sein, in bestimmten Fällen, wie das hinzufügen von logging-code oder etwas, was Sie nicht wollen, unterbrechen Sie den main-Programm fließen, wenn es fehlschlägt.
Ich vermute, dass etwas getan werden könnte, mit einige der features, die im Zusammenhang mit linq, aber nicht wirklich Zeit haben, zu schauen im moment. Wenn man einfach einen Weg finden, zu wickeln, eine Aussage als eine anonyme Funktion, dann verwenden Sie eine andere zu nennen, die innerhalb eines try-catch-block, es würde funktionieren... aber nicht sicher, ob das möglich ist, nur noch.
InformationsquelleAutor CodeRedick
Wenn man den compiler an, geben Sie einen Ausdruck-Baum für diesen code, dann könnte man ändern, dass die expression tree durch ersetzen jede Anweisung mit einem neuen try-catch-block umschließt, die der ursprünglichen Aussage. Das ist nicht so weit hergeholt, wie es klingt; für LINQ, C# erworben, die Fähigkeit zur Erfassung von lambda-Ausdrücken als Ausdruck Bäume, die manipuliert werden können in user-code zur Laufzeit.
Dieser Ansatz ist heute nicht möglich .NET 3.5 -, wenn aus keinem anderen Grund als das fehlen eines "try" - Anweisung im System.Linq -.Ausdrücke. Jedoch, es kann sehr gut sein, lebensfähig in einer zukünftigen version von C# sobald die Zusammenführung von DLR und LINQ expression trees abgeschlossen ist.
InformationsquelleAutor Curt Hagenlocher
Warum nicht die Reflexion in c#? Du könntest eine Klasse erstellen, die Licht auf den code, und verwenden Sie die line #s als Hinweis für das, was setzen Sie in jedes einzelne try/catch-block. Dies hat einige Vorteile:
Aber ich würde empfehlen, gegen diese, es sei denn, Sie übernehmen Wartung von someelses arbeiten und müssen Sie Holen Sie sich ein Griff auf die Ausnahmen, so dass Sie Sie beheben kann. Könnte Spaß machen, es zu schreiben.
InformationsquelleAutor Sam Hendley
Spaß, Frage; sehr schrecklich.
Es wäre schön, wenn könnten Sie ein makro verwenden. Aber das ist gestrahlt C#, so dass Sie könnte es lösen mit einigen Präprozessor-Arbeit oder irgendein externes tool, um wickeln Sie Ihre Linien in den einzelnen try-catch-Blöcken. Nicht sicher, ob Sie gemeint Sie wollte nicht manuell wickeln Sie Sie oder dass Sie vermeiden wollte, try-catch - ganz.
Herumspielen mit dieser, ich habe versucht, die Kennzeichnung jeder Zeile springen und wieder von einem einzigen fangen, ohne viel Glück. Allerdings Christopher aufgedeckt der richtige Weg, dies zu tun. Es gibt einige interessante weitere Diskussion dieser in Dot Net Gedanken und Mike Stall ' s .NET-Blog.
EDIT: natürlich. Die
try-catch
/switch-goto
Lösung aufgeführt werden nicht wirklich kompilieren, da dietry
Etiketten sind out-of-scopecatch
. Wer weiß, was fehlt, um so etwas zusammenzustellen?Könnte man automatisieren, mit einem compiler Vorverarbeiten Schritt oder vielleicht hack bis Mike Stall ' s-Inline-IL-Werkzeug Spritzen einige Fehler-Ignoranz.
(Orion Adrians Antwort über die Prüfung der Ausnahme und versuchen, die nächste Anweisung ist auch interessant.)
Alles in allem, wie es scheint, eine interessante und lehrreiche übung. Natürlich, Sie hätten zu entscheiden, an welchem Punkt der Aufwand zu simulieren ON ERROR RESUME NEXT überwiegt der Aufwand zu beheben der code. 🙂
InformationsquelleAutor b w
Fangen die Fehler in der UnhandledException-Ereignis der Anwendung. So, unbehandelte execptions kann auch protokolliert werden, wie an den Absender und alle weiteren Informationen, die der Entwickler vernünftig.
InformationsquelleAutor Andrew Neely
Leider sind Sie wahrscheinlich kein Glück. On Error Resume Next " ist eine veraltete option, die im Allgemeinen stark entmutigt, und nicht ein äquivalent, um meine Kenntnisse in C#.
Ich würde empfehlen, den code in VB (Es klingt wie das war die Quelle, da Ihre konkrete Anfrage für OnError ResumeNext) und die Verknüpfung mit oder aus einer C# - dll oder exe-Datei, die umsetzt, was der neue code, den Sie benötigen. Dann preform Umgestaltung zu bewirken, dass der code sicher zu sein, und konvertieren Sie diese sichere code in C#, wie Sie dies tun.
InformationsquelleAutor Guvante
Könnte man auf die Integration der Enterprise Library Exception-Handling-Komponente für eine Idee zu behandeln, wie unbehandelte Ausnahmen.
Wenn dies für die ASP.Net Anwendungen gibt es eine Funktion in der Globalen.asax aufgerufen, "Application_Error", die aufgerufen wird in den meisten Fällen mit schwerwiegendem Fehler wird anderen Fall in der Regel.
InformationsquelleAutor
Ungeachtet aller Gründe, die Sie wollen, um zu vermeiden, dies zu tun.......
Wenn es einfach ein Bedürfnis zu halten # von Zeilen nach unten, Sie könnten versuchen, so etwas wie:
Jedoch, Sie hätte ein Auge auf den Geltungsbereich von Variablen wenn Sie versuchen, erneut zu den Ergebnissen der Gespräche.
InformationsquelleAutor tyshock
Hilite jede Zeile, die man in einer Zeit, " Surround with try/catch. Das verhindert das kopieren, das einfügen, die Sie erwähnt
Was zur Hölle redest du? Wo zum Teufel gibt es eine variable Zuordnung in die Poster-Frage?
Die Implikation war, dass es "mal 100", das bedeutet, es gibt eine Menge code gibt, war das nicht vorgestellt. In diesem Fall ist, dann gibt es zwangsläufig eine variable Zuordnung oder zwei zusammen mit dem Dutzend oder so andere Konstrukte, die nicht try/catch ' ed einzeln.
100 X diese vier Zeilen code noch besitzt-NULL-Belegungen.
Ich würde Ihnen +1 für die lustigste Antwort in diesem thread, aber ich fürchte, dass Sie ernst sind :):):)
InformationsquelleAutor mattlant