Entwickler-Ecke

ASP.NET und Web - Wie realisiere ich die Methode bestmöglichst?


BlackMatrix - Sa 05.06.10 00:57
Titel: Wie realisiere ich die Methode bestmöglichst?
Ich habe das Problem, dass mir mein Programm manchmal eine StackOverFlowException (durch rekursiven Methodenaufruf) wirft, wenn ich die .exe meines Programmes ausführe. Öffne ich mein Projekt und starte dann das Programm, kam bisher noch nie eine Fehlermeldung, ich frage mich auch wieso eine kommen soll, denn normalerweise müsste doch die StackOverFlowExcetion mit in dem Code abgefangen werden oder?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
static public string GET(string url)
    {
        string html;

        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.CookieContainer = cookiecontainer;
            request.UserAgent = useragent;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream());
            html = sr.ReadToEnd().Replace("&""&");
            Console.WriteLine(url);
            return html;
        }
        catch (Exception ex)
        {
            if (ex.Message == "The operation has timed out" || ex.Message == "Der Remoteserver hat einen Fehler zurückgegeben: (403) Unzulässig.")
                return GET(url);
            else
                return "";
        }
    }


Ich möchte den Code gerne optimal haben. Mein Programm greif auf einen Server zu und wenn zu viele Anfragen gemacht werden, kann es passieren, dass "(403) unzulässig" zurückkommt, also wird die Methode erneut aufgerufen und das klappt dann meistens auch beim 2. Mal. Es muss aber scheinbar noch bei anderen Dingen (403) als Fehler kommen, wodurch meine Methode immer und immer wieder GET aufruft und die Exception kommt.

Wie unterscheide ich nun die beiden Fehler? Oder was kann ich an der Methode verbessern, dass nur wenn der Server wirklich nicht erreichbar ist, nichts zurückgegeben wird?


Christoph1972 - Sa 05.06.10 09:02

Moin,

ich würde sagen ja, das muss so "aufwendig" sein.(ist es doch garnicht). Alle anderen lösungen wären mindestens genau so "aufwendig"


Kha - Sa 05.06.10 10:44

Der zweite catch-Block sieht mir nach Pokemon Exception Handling aus ("Gotta catch 'em all"). Erwartest du denn außer WebException noch irgendeine andere Exception? Dann führ sie explizit auf.


BlackMatrix - Sa 05.06.10 12:55

..


Kha - Sa 05.06.10 13:25

Ok, dann schlage ich folgendes vor:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        catch (WebException ex)
        {
            if (ex.Status == WebExceptionStatus.Timeout)
                return html = GET(url);            
        }
        catch (IOException) { }
        return "";


BlackMatrix - Sa 05.06.10 18:27

..


BlackMatrix - Mo 19.07.10 13:14

Ich habe meinen Beitrag im ersten Post mal neu formuliert. Der Thread war einfach nichtssagend und deswegen habe ich es gleich hier reingemacht.

Weiß jemand Rat?


Christian S. - Mo 19.07.10 14:28

Was Du gemacht hast, ist absolut unerwünscht, weil die von anderen gegebenen Antworten nun komplett aus dem Zusammenhang gerissen sind und niemanden mehr nutzen. Nichtssagend ist der Thread erst durch Dein unangebrachtes Verhalten geworden!

Ich schließe hier mal. Erstelle bitte einen neuen Thread und halte Dich demnächst an die Regeln.

Christian