Guten Tag,
ich arbeite seit längerem an einem Programm welches auf ein XML-Interface zugreift und ganz einfach die Daten mit WebRequest ausliest. Mit Hilfe eines Timers werden auf der Form verschiedene Label mit den ausgelesen Werten aktualisiert . Klappt auch alles wie gewollt, nur gibt es ab und zu einen Error. Ich habe Ewigkeiten gedacht ich hätte das Problem gelöst, aber scheinbar war es ein ganz anderes Problem:
Ich bin zu dem Ergebnis gekommen, dass bei schlechter Internetverbindung (oder keiner) ein Error kommt. Jedoch habe ich noch keine Lösung gefunden den Error zu unterdrücken oder zu warten bis eine Verbindung da ist. Aber genug gelabert, vielleicht könnt ihr mir ja helfen:
Form1.cs:
Webseite test = new Webseite("http://www.meineseite.de/api-" + apikey + ".xml");
label1.Text = test.getGuthabenTotal() + "€";
Website.cs:
public Webseite(string url)
{
bool reply = CheckInternetConnection();
if (reply != false)
{
this.url = url;
//Webseite laden
WebRequest req = WebRequest.Create(this.url);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string s = sr.ReadToEnd();
this.HTML = s;
//Tags entfernen
Regex textreplace = new Regex("(<[^>]*>)");
this.Text = textreplace.Replace(this.HTML, "");
}
}
public string getGuthabenTotal()
{
Regex titlematch = new Regex(@"(?<=<total.*>)([\s\S]*)(?=</total>)");
return titlematch.Match(this.HTML).ToString();
}
Die Funktion "CheckInternetConnection()" (s.o.) habe ich ausproniert ist jedoch keine effektive Lösung:
public static bool CheckInternetConnection()
{
Ping ping = new Ping();
try
{
PingReply reply = ping.Send("www.meineseite.de", 1000);
return reply.Status == IPStatus.Success;
}
catch
{
return false;
}
}
Der Error besagt, dass string in Regex nicht NULL sein darf, desshalb gehe ich davon aus, dass die Funktion Regex nicht ausgeführt werden kann, da der HTML Code dank schlechter Verbindung nicht ausgelesen wurde. Ziel wäre also Regex zu sagen, dass er nichts machen soll, wenn nichts vorhanden ist - bisher aber nicht gelöst bekommen.
Auf eine Antwort würde ich mich sehr freuen.
Mit freundlichen Grüßen,
Fl0
P.S. den genauen Error werde ich ggb. hinzufügen, wenn er wieder auftritt.
würde ja mal den kompeltten WebRequest teil in ein try { } catch { } auslagern
und fehlermeldungen richtig abfangen!
Und da du ja anscheinend ein XML erhältst wurde ich empfehlen dieses mittels XPath oder LINQ auszulesen und nicht via RegEx.
Stelle fest welche art von Fehler bei "Verbindungsfeheler" kommt. Schreibe dafür einen separate catchAnweisung und das ganze packst du in ne schleife:
public void Huhu()
{
// Zähler für Schleife
int tmpCounter = 0;
while (tmpCounter < 10)
{
try
{
// verbinde zu Server
// führe aktion aus
// Aktion war erfolgreich
tmpCounter = 10;
}
catch (Exception specialEx)
{
// counter erhöhren
// Bei Verbindungsfeher
tmpCounter++;
}
catch (Exception ex)
{
// do something
}
}
}
que? como? no entiendo!!!!!
Danke für die schnellen und hilfreichen antworten.
@esskar Werde ich mit der Methode von The_Mexican machen, danke.
@chavez bin mit der jetzigen voll zufrienden, wieso ändern? Aber Danke für den Tip.
@The_Mexican
So werde ich es wohl machen, habe den Error:
\************** Ausnahmetext **************
System.ArgumentNullException: Der Wert darf nicht NULL sein.
Parametername: input
bei System.Text.RegularExpressions.Regex.Match(String input)
bei Tool_Tool.Form1.timer2_Tick(Object sender, EventArgs e) in C:\Visual Studio 2008\Projects\Tool\Tool\Form1.cs:Zeile 418.
bei System.Windows.Forms.Timer.OnTick(EventArgs e)
bei System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Muss also statt "Exception1": "System.ArgumentNullException" oder "ArgumentNullException" benutzen? Und was hat es mit dem "#" auf sich? Würde da eher ne zweite Integer Variable nutzen und die auf z.B. 10 stellen und wenn x sowie die neue Variable 10 erreicht hat ausgeben, dass keine verbindung vorhanden ist.
Danke euch
Fl0
catch (ArgumentNullException argNullEx)
{
...
tmpCounter++
}
greets und gutes gelingen
que? como? no entiendo!!!!!
public void Huhu() { // Zähler für Schleife int tmpCounter = 0; while (tmpCounter < 10) { try { // Aktion war erfolgreich tmpCounter = 10; } // ... } }
würde ich eher als
// Aktion war erfolgreich break;
schreiben!
Danke euch!
Habe jetzt folgendes gemacht:
public Webseite(string url)
{
int tmpCounter = 0;
while (tmpCounter < 10)
{
try
{
this.url = url;
//Webseite laden
WebRequest req = WebRequest.Create(this.url);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string s = sr.ReadToEnd();
this.HTML = s;
//Tags entfernen
Regex textreplace = new Regex("(<[^>]*>)");
this.Text = textreplace.Replace(this.HTML, "");
// Aktion war erfolgreich
tmpCounter = 10;
}
catch (ArgumentNullException argNullEx)
{
// counter erhöhren
// Bei Verbindungsfeher
tmpCounter++;
}
catch (WebException argNullEx)
{
tmpCounter = 10;
MessageBox.Show("No Internet Connection ! :(");
}
}
}
Problem ist, dass im catch Beispiel "WebException=Null" die Message Box dauernd wieder aufgerufen wird, kann man das verhindern? Denke das liegt ja am Timer der auf ziemlich häufige 1,2 Sek. eingestellt ist und dementsprechend immer wieder die Funktion aufruft.(wird noch geändert)
Würde dann bei der WebException den Timer drastisch erhöhen und sofern alles klappt und man in kein "catch" kommt den TImer wieder erhöhen.
Danke und MfG
Fl0
also,
copy paste ist kein schöner stil 😉 s.h. die Benamung deiner Exception-objekte
public Webseite(string url)
{
int tmpCounter = 0;
try
{
while (tmpCounter < 10)
{
try
{
this.url = url;
//Webseite laden
//...
//Tags entfernen
//...
// Aktion war erfolgreich
break;
}
catch (ArgumentNullException argNullEx)
{
// counter erhöhren
// Bei Verbindungsfeher
tmpCounter++;
}
}
if(counter = 10)
{
// messageBox.show("internetverbindung)
}
}
catch(Exception ex)
{
// do something;
// Schreib in log, oder ähnliches what ever ;)
}
}
die msg box wird jetzt nur aufgerufen wenn du innerhalb der Anzahl versuche die gewünschte Aktion nicht erfolgreich ausführen konntest.
que? como? no entiendo!!!!!