ich bräuchte ein paar tipps zum einsatz von exceptions:
als beispiel nehme ich nen graphen mit punkten drauf und linien zwischen zwei punkten. mit addPoint() zeichnet man nen punkt auf dem graphen (addPoint(x,y) tut dasselbe, erzeugt aber vorher das MyPoint-Objekt). addLine() erzeugt ne Linie zwischen zwei bereits existierenden Punkten (ansonsten gibts ne Exception):
meine frage nun zb zu addPoint(x,y), welches das MyPoint-Objekt kreiert und danach addPoint(MyPoint) aufruft:
soll diese Methode nun beide Exceptions, also IllegalPointParametersException und PointAlreadyExistsException, werfen? oder sollte ich ne CannotCreatePointException machen, die dann eben eine der anderen beiden als nested exception hat?
getLine(p1,p2) liefert nur dann ne Linie, wenn diese existiert. wäre es nun die beste lösung, immer ne NoSuchLineException zu werfen oder NoSuchLineEx mit nested NoSuchPointEx oder soll ich die getLine Methode beide Exceptions werfen lassen?
bei addLine(p1,p2) ists dasselbe mit NoSuchPointException und LineAlreadyExistsEx.
bei addLine(x1,y1,x2,y2) gibts dann noch ein paar möglichkeiten mehr.
---
ich gehe mal stark davon aus, dass es auch auf das jeweilige programm ankommt, was man von weiter außen mit den exceptions anfangen kann, ob viele verschiedene programme den graph verwenden, etc.
aber könnt ihr mir vielleicht trotzdem ein paar anhaltspunkte (oder auch nen guten link) geben, wie man solche design-entscheidungen trifft.
ich habe es bei kleineren nur für mich geschriebenen programmen meist so gemacht, dass ich eine exception dort abfange, wo sie auftritt, dann ne fehlermeldung ausgebe und danach meist einfach null returniere. (sprich ich habe meist keine eigenen exceptions verwendet). ganz konkret hab ich das eigentlich immer dann gemacht, wenn die aufrufende klasse sowieso nur wissen muss, ob alles geklappt hat oder nicht (und nicht den grund wissen muss).
aber in obigem fall ist dies ja nicht so, denn man möchte eventuell durchaus wissen, woran es lag, dass die linie nicht gezeichnet werden konnte. läuft das graph-programm dann zb noch als eigenständiges programm, kriegt man auch eventuell auch keine logausgaben mehr.
also sollte man, wenn man nicht zu faul dafür ist, möglichst viele exceptions thrown, diese aber schon nesten, wo es geht (also zb schon nen OberTyp wie CannotAddPointException machen). oder hängt es auch von der vererbungshierarchie ab: also zb dass es es drauf ankommt, ob es sinn macht, dass die PointExceptions UnterTypen von LineExceptions sind und man je nachdem in der MethodenSignatur nur den OberTyp throwt oder eben Point und Line Exceptions...? oder sollte ich dann sogar eines drüber gehen und ne GraphException machen? ..
also wie ihr sehr, ist mir da vom design her einiges unklar
als beispiel nehme ich nen graphen mit punkten drauf und linien zwischen zwei punkten. mit addPoint() zeichnet man nen punkt auf dem graphen (addPoint(x,y) tut dasselbe, erzeugt aber vorher das MyPoint-Objekt). addLine() erzeugt ne Linie zwischen zwei bereits existierenden Punkten (ansonsten gibts ne Exception):
Code:
class MyPoint {
..
MyPoint(int x, int y) throws IllegalPointParametersException; // zb negative koordinaten
{..}
..
}
class Graph {
void addPoint(MyPoint point) throws PointAlreadyExistsException;
void addPoint(int x, int y) throws ?
MyPoint getPoint(MyPoint point) throws NoSuchPointException();
MyPoint getPoint(int x, int y) throws NoSuchPointException();
void addLine(MyPoint p1, MyPoint p2) throws ?
void addLine(int x1, y1, x2, y2) throws ?
MyLine getLine(MyPoint p1, MyPoint p2) throws NoSuchLineException (auch NoSuchPointException?)
}
meine frage nun zb zu addPoint(x,y), welches das MyPoint-Objekt kreiert und danach addPoint(MyPoint) aufruft:
soll diese Methode nun beide Exceptions, also IllegalPointParametersException und PointAlreadyExistsException, werfen? oder sollte ich ne CannotCreatePointException machen, die dann eben eine der anderen beiden als nested exception hat?
getLine(p1,p2) liefert nur dann ne Linie, wenn diese existiert. wäre es nun die beste lösung, immer ne NoSuchLineException zu werfen oder NoSuchLineEx mit nested NoSuchPointEx oder soll ich die getLine Methode beide Exceptions werfen lassen?
bei addLine(p1,p2) ists dasselbe mit NoSuchPointException und LineAlreadyExistsEx.
bei addLine(x1,y1,x2,y2) gibts dann noch ein paar möglichkeiten mehr.
---
ich gehe mal stark davon aus, dass es auch auf das jeweilige programm ankommt, was man von weiter außen mit den exceptions anfangen kann, ob viele verschiedene programme den graph verwenden, etc.
aber könnt ihr mir vielleicht trotzdem ein paar anhaltspunkte (oder auch nen guten link) geben, wie man solche design-entscheidungen trifft.
ich habe es bei kleineren nur für mich geschriebenen programmen meist so gemacht, dass ich eine exception dort abfange, wo sie auftritt, dann ne fehlermeldung ausgebe und danach meist einfach null returniere. (sprich ich habe meist keine eigenen exceptions verwendet). ganz konkret hab ich das eigentlich immer dann gemacht, wenn die aufrufende klasse sowieso nur wissen muss, ob alles geklappt hat oder nicht (und nicht den grund wissen muss).
aber in obigem fall ist dies ja nicht so, denn man möchte eventuell durchaus wissen, woran es lag, dass die linie nicht gezeichnet werden konnte. läuft das graph-programm dann zb noch als eigenständiges programm, kriegt man auch eventuell auch keine logausgaben mehr.
also sollte man, wenn man nicht zu faul dafür ist, möglichst viele exceptions thrown, diese aber schon nesten, wo es geht (also zb schon nen OberTyp wie CannotAddPointException machen). oder hängt es auch von der vererbungshierarchie ab: also zb dass es es drauf ankommt, ob es sinn macht, dass die PointExceptions UnterTypen von LineExceptions sind und man je nachdem in der MethodenSignatur nur den OberTyp throwt oder eben Point und Line Exceptions...? oder sollte ich dann sogar eines drüber gehen und ne GraphException machen? ..
also wie ihr sehr, ist mir da vom design her einiges unklar