SQL Server Synchronisation
Geizhals » Forum » Programmierung » SQL Server Synchronisation (47 Beiträge, 289 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.............
Re(13): SQL Server Synchronisation
07.03.2007, 14:02:09
Hätte ich ein bißchen anders gesehen....

Grundsätzlich teile ich deine Beschreibung des semantischen Unterschieds...

Für "normale" Behandlung ist if/then/... super...
Für "anormale" Ereignisse eher try/catch...

try/catch-Beispiel, das IMHO Sinn macht:
try { a=b/c ; b = d/a ; f=a/(b*c) ; h=2*3/f^g } catch (DivisionByZeroException ex) { //Behandle Division durch 0 }

Natürlich könnte man das alles auch durch if/then-Lösen... Unter Einsatz von Hilfsvariablen für den Nenner, die jede vorab einzeln auf 0 überprüft werden... Dann wird's aber unnötig lang.

Problematisch ist an Exceptions IMHO die Fehlersuche. Beispiel in Pseudocode:


static function neuerSpieler(String name, Team team) returns Spieler
{
  // legt einen Spieler mit Namen name an und ordnet ihn einem Team zu.
  // liefert im Fehlerfalle NULL als Spieler zurück.
var spieler = null;
try {
   Spieler spieler=new Spieler(name);
   team.add(spieler);
   spieler.setpoints(0);
} catch (Exception ex) {
  spieler = null;
}
return spieler
}


Dieses Beispiel (leider oft ähnliches auch in Lehrbüchern gefunden) zeigt die Probleme bei Exceptionhandling - alles IMHO :-)

Auf den ersten Blick sieht's nicht ganz schlimm aus...

Fürchterlich wirds aber, wenn spieler.setpoints() eine Exception werfen kann...
Denn dann hätten wir einen angelegten Spieler im Team - er würde nur nicht zurückgeliefert. Im besten Falle "nur" ein Memoryleak... Schlimm aber, wenn man später über die Teams iteriert und eine Mitgliederliste baut... Denn dann gibt's eine Referenz auf einen Spieler (wg. team.add() ), die aber zu keinem "gültigen" Spieler führt (zumindest zu einem, bei dem - warum auch immer - setpoints() nicht klappte...

Noch schlimmer sind oftmals Funktionen, wo es sich der Programmierer einfach machte - und ein throws in der Deklaration angab.... Wenn du so eine Funktion verwendest, muß man sich gelegentlich für jede einzelne Zeile der Funktion ansehen, wie dein catch() aussehen müßte...

Ich will nicht über try/catch herziehen - aber IMHO(!) sollte man mit try/catch sehr sparsam umgehen... Und insbesondere auf throws weitestgehend verzichten...

Und es eigentlich nur für Ausnahmefehler verwenden, wobei ein if-then-else oft den Vorteil hat, daß der Fehler genau da behandelt wird, wo er passiert - und dadurch der Code oft (natürlich nicht immer) bei weitem lesbarer wird.

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
...............
Re(15): SQL Server Synchronisation
07.03.2007, 14:34:46
Sorry...

Vielleicht ein anderes Beispiel:
Angenommen, du nimmst guten, alten C-Code (der nun freilich als unakzeptabler legacy-Prozedural-Code bezeichnet wird) - dann hast du oft Konstrukte drin (wieder Pseudocode) wie

Spieler * machwas(char *name, ...) 
{
    buffer *b, *c;
    if (!(b = malloc(100)) {        // 100 Bytes f. b anfordern
        schreib_fehler("Out of Memory");
         return NULL;
    }
    if (!machWasAnderes(name)) {
        free(b);   // Bytes von b wieder freigeben
         schreib_fehler("was anderes klappte nicht");
         return NULL;
    }
   ....
   return b;           // b zurückgeben.
}


Vorteil:
Genau dort, wo ein Fehler passiert (das sind die "!"-Konstrukte) passiert die Fehlerbehandlung. Dir kann nichts durchrutschen, ....

Nachteil:
Wenn man auf das "free(b)" vergißt, hast du ein MemoryLeak geschaffen... Was ja öfters mal passierte

Lösungsansatz:
try { Mach so Einiges - fordere auch Ressourcen an, ... } catch { Reagiere auf Fehler } finally { gib alle Ressourcen wieder frei }

Klingt an sich ja absolut sinnvoll - und drum haben try/catch-Blöcke durchaus ihre Berechtigung.

Das Problem ist dabei - aus meiner Sicht(!) - daß die Fehlerbehandlung nicht gleich dort stattfindet, wo der Fehler passiert - sondern zeitlich versetzt. Dadurch kann Dir meiner Meinung nach oft auch leichter was durchrutschen als vorher...

So war auch mein Spielerbeispiel zu sehen:
Da waren 3 Schritte drin:
1.) Lege einen Spieler an
2.) Ordne ihn einem Team zu
3.) Setze seine Punkte auf 0
4.) Liefere den Spieler zurück

-- Wenn was nicht klappt - liefere Null zurück. (Das Setzen des Spielers auf NULL läßt seine Referenz verschwinden, wenn keine Referenz mehr existiert, wird er (irgendwann) wirklich gelöscht... Daher  sieht der Code gut aus. (Java-Beispiel, AFAIK ist es in C# ähnlich.)

Wenn Du über so einen Code stolperst, mußt Du Dir /immer/ für jede Zeile des try-Blocks überlegen, ob das paßt.
Du beginnst also:
Wenn (1) nicht funktioniert - Dann wurde eh kein Spieler angelegt, wir liefern NULL zurück - paßt.
Wenn (2) nicht funktioniert - Dann wurde er keinem Team zugeordnet, wir setzen eh im catch() den Pointer auf NULL, dadurch wird die einzige Referenz eliminiert - paßt.
Wenn (3) nicht funktioniert... Dann wurde der Spieler aber schon einem Team in (2) zugeordnet - dann hat das Team eine Referenz, die es wohl nicht haben sollte. Dadurch wird der Speicher nicht freigegeben - und das Team hat einen ungültigen Spieler drinnen... Wenn es /irgendwann/ beim Schreiben dein Programm aufstellt, weil Du eine Spielerliste der Teams ausgeben willst... Findest Du dann auf die schnelle den Fehler, der hier passierte ??? Also ich brauche meistens laaange :-)

Der Fehler war in diesem Beispiel die Reihenfolge...
1.) Lege einen Spieler an
2.) Setze seine Punkte auf 0
3.) Ordne ihn einem Team zu
wäre richtig gewesen :-)

Meiner Meinung nach sind try/catch-Blöcke oftmals weit schwieriger zu debuggen... Weil Du, wenn du gerade im catch()-Block bist Dir Fehler überlegen mußt, die ganz wo anders haben passieren können...

Drum setze ich try/catch zwar schon gerne ein - aber eben nur sparsam.

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
...............
Re(15): SQL Server Synchronisation
07.03.2007, 17:24:12

Schönes Beispiel

Das war zwar mal schnell aus den Fingern gesogen - aber ähnliche findest echt oft in der Praxis... Und eben auch in Lehrbüchern, was schon giftig ist...


*pfeif* .... Spass beiseite. Manchmal muss man es machen, weil es anders keinen Sinn ergibt und semantisch einfach nicht korrekt wäre (ich kann nicht einfach null zurückliefern, wenn man eigentlich ein Objekt mit bestimmten Eigenschaften erwartet, genausowenig Sinn macht es ein leeres Objekt zurückzuliefern.)

Klar kann Exception-Werfen Sinn machen... Und ich behaupte ja auch nicht, daß ein Programmierer immer faul war, wenn er ein throws.. schreibt. Ich behaupte aber doch, daß öfters mal einer faul war :-).

Wobei "Ich kann nicht null zurückliefern"... Was spricht dagegen ?
Fast alle C-Funktionen liefern NULL oder -1 im Fehlerfall... Das ist ein "gut eingelebtes" Konzept....

Für den Aufrufer wäre es sogar gleich...
Bei Dir (throws...) müßte er schreiben

try { MeinObjekt meinObjekt = MeineObjektFactory.holEins(); meinObjekt.machwas(); } catch (....)


Denselben try/catch-Block hättest auch, wenn "holEins()" statt eine Exception zu thrown einfach null zurückliefert... Denn ab "machWas()" fliegt die Exception und Du bist genauso im catch().

Wenn aber null zurückgeliefert wird, kannst auch "if (...holEins() != null) {...}" durchführen... :-)

Exceptions werfen kann aber durchaus dann Sinn machen, wenn es beispielsweise 3 Gründe geben kann, warum eine Funktion nicht so tut wie der Aufrufer wohl wollte - und du ihm das mitteilen willst (zB durch eigene Exceptionklassen). Dann wird's schon gerne mal sehr brauchbar... Und das deckt sich so mit meiner These "Exceptions sind super für Ausnahmesituationen".... Beispielsweise einr "throw new AusserhalbDerDienstzeitNichtErlaubtException();"...  - wenn dein "Ich kann nicht einfach NULL zurückliefern" so gemeint war - sind wir nahe beieinander.

Andererseits war ich aber auch mal bei einem Projekterl, wo /wirklich viele/ eigene Exceptionklassen definiert wurden... Mit dem logischen Erfolg, daß kein Aufrufer sich je antat, nach der Art der Exception zu unterscheiden und wohl 90% des Handlings a la "try { machWas(); } catch (Exception ex) { SagUser(ex.messageText); }" aussahen :-)

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..
Re(2): SQL Server Synchronisation
07.03.2007, 12:48:21
Wegen der Datensicherheit wird es ja nicht sein - denn dann müßten immer beide
online sein.
Es wird also -vermutlich- darum gehen, daß er seine Datensätze
sehen/bearbeiten kann, auch wenn er offline ist...
(denn sonst würde man ja nur eine Datenbank am VerkaufsPC fahren).

stimmt. backup wird warscheinlich noch extra gemacht werden sobald sich das notebook  verbindet.

Du hattest eine "Masterdatenbank" - und am Lappy (zB als Kundenbetreuer) ein
Replikat, daß du ein- und auschecken konntest... Das war beliebt für
Außendienstmitarbeiter, die am Lappy ihre Kundendatenbank, ... mitnahmen - und
beim einchecken ins Firmenlan ihre Daten auf den Master zurückspielten...

es soll extern eigentlich keine daten hinzukommen, sondern nur diverse Auswertungen bei bedarf unterwegs gemacht werden. wenn das notebook im lan hängt sollen natürlich neue daten hinzugefügt werden können. deshalb finde ich die idee das sich das notebook zum server verbindet nicht schlecht.

Also so:
bei nw Verbindung:
neue daten werde über das netzwerk direkt auf dem server hinzugefügt. ist das beendet wird eine replikation auf das Notebook gemacht welches dann alle daten bis zum replikationszeitpunkt hat.

ohne nw Verbindung:
es können keine daten hinzugefügt werden, sondern nur berichte von den vorhandenen Daten erstellt werden.










Zitat1:"Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos
ausgegeben. Den Rest habe ich einfach verprasst." George Best.

Zitat2: Umweltfreundlich ist wenn man den Schummelzettel beim Wiederholungstest wiederverwendet
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung