ebody: try/catch - warum wird throw new Error() nicht ausgeführt und ist das die richtige Art, zurückzugeben was genau falsch ist?

Beitrag lesen

Hallo Rolf,

vielen Dank für dein Feedback.

Die response-Eigenschaft der Rückgabe ist mehrdeutig. Bei status==true ist es die fachliche Antwort, bei status==false das Fehlerobjekt. Das ist schwierig zu handhaben. Vor allem hat die response-Eigenschaft keinen klaren Datentyp.

Der Gedanke war, dass jede Methode immer ein Objekt mit den gleichen Keys zurückgibt und weiß, response gibt mir entweder Fehler Details oder was ich von der Methode haben möchte. Wäre die gängige Praxis, im Fehlerfall den Key error, statt response zu verwenden?

Deine Checks verlieren den Bezug zum geprüften Ding. Sprich: Wenn Du die Fehlermeldungen ausgibst, weißt Du zwar, dass da etwas Kein String war. Aber wenn die Methode 3 Strings erwartet, weißt Du nicht, welcher Parameter das war. D.h. du musst eine Kontextinformation mitgeben, z.B. den Parameternamen, und die Check-Methode muss diese Info in die Message einbauen.

In der (und in jeder anderen) Methode würde ich das Array arrCheck (hieß zuvor objCheck) erstellen. Darin lege ich fest welcher Parameter auf was geprüft werden soll. Das erste Element bezieht sich auf den ersten Parameter, das 2. Element auf den 2. Parameter usw. Jedes Element kann mehrere Prüfungen enthalten.

Die check-Methode enthält einen dicken Switch über den type Parameter. Es gibt keinen gemeinsamen Code für alle type-Werte. Du solltest eine Methode pro type schreiben: checkTypeArray, checkEmptyArray, checkTypeString, checkEmptyString, checkTypeInt.

type bestimme ich selbst. Ich übergebe ihn als Parameter für check(). Z.B. parameter.check(arr,'typeArray').

Die Bezeichnung "emptyArray" ist irreführend. Der Check "typeString" legt nahe: Es wird erwartet, dass der Typ "String" vorliegt. Der Check "emptyArray" würde, bei gleicher Lesart, nahelegen, dass ein leeres Array erwartet wird. Es ist aber genau andersrum. Der Typ des Checks sollte also "notEmptyArray" heißen.

Schaue ich nochmal und passe es an.

Es ist sehr umständlich, dass Du in objCheck ein Array von Objekten aufbaust. Das macht die status-Prüfung kompliziert. Du verwendest die Keys dieser Objekte nicht. Du könntest also einfach ein Array aus allen Prüfungen erzeugen, ohne Keys.

Wenn ich über response in einem Fehlerfall das Objekt erhalte, zeigen die Keys, um welche Prüfung es ging.

Die status-Methode des parameter-Objekts finde ich unverständlich. Ich würde sie IsSuccess oder so nennen.

Ich überleg noch mal einen anderen Namen.

Die Check-Implementierung ist aufwändig. Natürlich kann man Objekte mit status und message erzeugen (nicht msg), aber wenn Du aufwändigeren Code hast, sammeln sich dafür ganz ordentliche Laufzeiten an. Ein Objekt zu erzeugen ist nicht billig. Auf diesem tiefen Level ist eine Optimierung durchaus sinnvoll; ich würde aus den check-Methoden null oder undefined zurückgeben, wenn die Check erfolgreich war, und eine Fehlermeldung, wenn er es nicht war.

Anstatt, dass parameter.check() Objekte zurückgibt, könnte man ja auch nur true/false zurückgeben. Da ich den Key wie z.B. typeArray habe, weiß ich was überprüft wurde und funktioniert oder nicht. In einem weiteren Script könnte ich darauf reagieren und jeweils eine individuelle Fehlermeldung erstellen. Weil, ich brauche ja nicht immer einen Text (message) für das Überprüfungs für jedes Ergebnis.

let arrCheck = [
           {
             typeArray: parameter.check(arr,'typeArray') // true/false,
             emptyArray: parameter.check(arr,'emptyArray'),
           },
           {
             typeString: parameter.check(str,'typeString')
           }     
         ]

Bzgl. Laufzeit. Die Überprüfungen in const parameter werden ja nur einmalig eingebunden und aus verschiedenen Methoden auf nicht alle, sondern gezielte Prüfungen zugegriffen. Grob geschätzt könnten sich max. 50 Prüfungen in dem Objekt mit der Zeit ansammeln. Wäre das wirklich so deutlich spürbar?

Und noch ein Tipp:

let hasError = !checkResults.every(result => result.status)

Das bezieht sich auf diesen Schnippsel oder?

status: function status(arrCheck){
    return arrCheck.map(obj => Object.values(obj).map(objCheckValue => objCheckValue.status).includes(false)).includes(true);
  },

Auf jeden Fall auch Danke für diesen Tipp. every kannte ich gar nicht. Ich muss mal schauen, ob ich das verkürzen kann. Weil ich ja wahrscheinlich dieses Array in dieser Form nutzen werde.

let arrCheck = [
           {
             typeArray: parameter.check(arr,'typeArray'),
             emptyArray: parameter.check(arr,'emptyArray'),
           },
           {
             typeString: parameter.check(str,'typeString')
           }     
         ]

Gruß ebody