1

Ist es eine gute Praxis, einen Fehler zu werfen, wenn eine Funktion aufgerufen wird und einen Parameter fehlt, der für die korrekte Ausführung der aufgerufenen Funktion notwendig ist?Making Params erforderlich in Funktion

Zum Beispiel (in JavaScript):

var sayHi = function(name) { 
    console.log(name + ' says hi!'); 
} 

gegen

var sayHi = function(name) { 
    if(!name) { throw new Error('param is missing'); } 
    console.log(name + ' says hi!'); 
} 

Gibt es eine starke Meinung zu, ob das zweite Beispiel ist eine gute Codierung der Praxis oder wenn es fügt nur unnötig Blähungen, dass kann dazu führen, dass häufig unnötige Fehler in ein komplexeres Programm, das sich aus Dutzenden oder gar Hunderten von Dateien zusammensetzt, geworfen werden?

+0

Dies ist alles nach Meinung. Ich neige dazu, solche Überprüfungen nicht einzuschließen, da sie meinen Code verlangsamen, so dass es dem Programmierer überlassen bleibt, seine Funktionen korrekt aufzurufen. Alternativ können Sie eine statisch typisierte Sprache wie [TypeScript] (http://www.typescriptlang.org/) verwenden, die sicherstellt, dass Funktionen immer mit der richtigen Anzahl von Argumenten aufgerufen werden. –

+0

@ raiti13 wenn einige der Antworten Ihnen geholfen haben, bitte akzeptieren Sie es, um zukünftigen Benutzern zu helfen :) – FredMaggiowski

Antwort

2

Sie können mit es6 eine Funktion übergeben, die sofort einen Fehler als Standardwert wirft

const err = msg => { throw Error(msg) } 

const sayHi = function(name = err('Name is undefined')) { 
    console.log(name + ' says hi!'); 
} 

Dies hat eine etwas bessere Leistung als mit der if Aussage im Inneren des Körpers der Funktion und verbessert die Lesbarkeit erreichen, dass. Ein anderer Gedanke, den Sie tun können, ist einen Dekorateur zu bauen, der das Gleiche macht. Etwas wie:

@required('name') 
const sayHi = function(name = err('Name is undefined')) { 
    console.log(name + ' says hi!'); 
} 

Wie Sie in Ihrer Frage erwähnen Is there a strong opinion, könnte die Antwort nur meist opinionated sein, so meiner Meinung nach sollten Sie immer eine Fehlerbehandlung Strategie. Entweder im Funktionshebel oder in der Anwendungsebene. Es ist meiner Meinung nach sehr unwahrscheinlich, dass die Fehlerbehandlung Ihr Leistungsengpass sein wird.

+0

Dies beantwortet die Frage nicht. Dies ist nur eine bequeme Art zu tun, was OP bereits tut. Sie fragen, ob sie * einen * Fehler werfen sollten, wenn ein Argument nicht gegeben wird. –

+0

@MikeC hat es als Standard-Parameter, anstatt innerhalb des Körpers der Funktion zu überprüfen verbessert die Leistung und macht den Code lesbarer ... So denke ich, ist nicht so mit der Frage nicht verwandt. Wie auch immer, Danke für den Downvote. –

+0

Außer dass es nicht. Dieser Check wird immer noch irgendwo ausgeführt und wenn Sie [Code auf ES5 kompilieren] (https://babeljs.io/repl/#?evaluate=true&presets=es2015%2Creact%2Cstage-2&experimental=true&loose=false&spec=false&code = const% 20rs% 20% 3D% 20msg% 20% 3D% 3E% 20% 7B% 20throw% 20 Fehler (% 20msg% 20)% 20% 7D% 0D% 0A% 0D% 0Aconst% 20SayHi% 20% 3D% 20function (Name% 20% 3D% 20err ('Name% 20is% 20undefiniert'))% 20% 7B% 0D% 0A% 20% 20console.log (Name% 20% 2B% 20 '% 20% says% 20hi!')% 3B % 0D% 0A% 7D) dann wird es direkt in einen Scheck umgewandelt, der dem ähnelt, was OP gepostet hat. –

0

Es kommt darauf an. Sie sollten fast immer eine Art von Fehlerbehandlung haben, aber welche Art von Handhabung hängt von der Situation ab.

Manchmal ist es einfach in Ordnung, einen Fehler zu werfen, andere Male möchten Sie vielleicht etwas tun, wenn Sie einen Fehler haben.

Sie könnten etwas wie einen Versuch/Fang verwenden, oder in diesem Fall nur nach undefiniert suchen und etwas damit tun.

1

Das erste, was zuerst:

Es ist wirklich an Ihnen zu entscheiden, ob Sie sollten oder nicht throw Ausnahme und nicht return ein Fehlercode (oder null, oder was auch immer).

Soweit ich weiß, gibt es keine großen Probleme beim Auslösen von Ausnahmen anstelle von Fehlern, so weit wie Sie behandeln sie richtig.

Dies führt zu der Frage:

Wann ist richtig eine Ausnahme (oder Fehler bei JS) zu werfen?

Die Frage ziemlich heikel ist, und hier gekennzeichnet und geschlossen als „basierte in erster Linie Meinung“ da dies bis zu persönlicher Meinung vielleicht .. soll

eine ähnliche Frage

.. gut, (na ja ..genau diese Frage) wurde schon gefragt und antwortete here und ich finde mich mit der akzeptierten Antwort einverstanden, in diesem Kommentar zusammengefasst:

Genau! Eine Ausnahme wird ausgelöst, wenn und nur wenn Funktionsvoraussetzungen (Annahmen über Argumente) gebrochen sind! - @Lightman

In Ihrer Situation, wenn die Annahmen Ihrer Funktion (Ihr erwarteter Parameter) verletzt werden: ja, eine Ausnahme auslösen, da JS bietet kein Syntax-Konstrukt einen Funktionsparameter als required einzustellen.


Mit ES6 können Sie default parameters verwenden so etwas wie das Verhalten zu zwingen, Sie wollen:

function missingParameterHandler() { 
    throw new Error('Missing parameter'); 
} 

function foo(aRequiredParameter = missingParameterHandler()) { 

    // Use your required parameter 
    console.log("Hello " + aRequiredParameter); 
} 

// Hence: 
foo("World") // OK 
foo()  // -> Throws exception 

Beispiel aus here genommen, während here können Sie weitere Beispiele zu dieser Funktion finden.

Dies ist erreichbar, weil, wenn aRequireParameter nicht übergeben wird, wird der Standardwert zugewiesen (in diesem Fall aufgerufen) und daher wird die Ausnahme/Fehler geworfen werden.