2016-08-02 15 views
2
zu vermeiden

Ich habe die folgende Methode, die eine Excel-Arbeitsmappe öffnet und es zurückgibt, um in einer anderen Methode verwandt zu werden.Geben Sie null zurück, um unbekannte Ausnahmen von einer Methode in C#

private Excel.Workbook openWorkbook() 
    { 
     // Get excel file path returns the file path of the excel workbook if it exists, otherwise returns null. 
     List<string> filePaths = getExcelFilePath(); 
     if (filePaths != null) 
     { 
      return excel.Workbooks.Open(filePaths[0]); 
     } 
     return null; 
    } 

Wie Sie sehen, ich bin der Rückkehr null eine try-catch für eine nicht-exixtent Arbeitsmappe zu vermeiden, wenn ich diese aus einem anderen Methode aufrufen. Ist es eine schlechte Übung, dies zu tun? Ich habe eine ähnliche Sache in dem folgenden Verfahren, die eine Liste zurückkehren soll:

private List<string> getSOsToDelete() 
    { 
     // rawData is private variable in the class. If the workbook was not open this worksheet is set to null in another method similar to openWorkbook() above. 
     if (rawData != null) 
     { 
      List<string> ToDeleteSOs = new List<string>(); 
      for (int i = rawData.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing).Row; i > 1; i--) 
      { 
       if (rawData.Cells[i, 7].Value2.ToString() != "B2B" || rawData.Cells[i, 7].Value2.ToString() != "" || rawData.Cells[i, 8].Value2.ToString() != "Trns-Inc" || rawData.Cells[i, 8].Value2.ToString() != "") 
       { 
        string SONumber = rawData.Cells[i, 3].Value2.ToString(); 
        ToDeleteSOs.Add(SONumber); 
       } 
      } 
      return ToDeleteSOs; 
     } 
     return null; 
    } 

Wenn nicht, was ist die beste Art und Weise Methoden wie diese zu schreiben? Für Teil 2 könnte ich eine leere Liste zurückgeben und auf Länge prüfen. Ich bin mir nicht sicher, was besser ist. Bei der ersten Methode bin ich jedoch nicht sicher, was ich zurückgeben soll, wenn die Datei nicht existiert.

+1

Es ist nichts falsch mit der Rückkehr 'null' wenn es Sinn macht (wie es tut in Ihrer ersten Funktion), aber die wirkliche Frage ist, warum versuchen Sie, einen Versuch zu vermeiden? .catch? – txtechhelp

+1

Antworten auf diese werden sehr unterschiedlich sein, weil es hier nicht genügend Informationen gibt, um eine fundierte Meinung zu geben. Null von OpenWorkbook() sollte in Ordnung sein. Wenn die Arbeitsmappe nicht vorhanden sein muss, ist das Auslösen einer Ausnahme möglicherweise die bessere Antwort. –

+0

Eigentlich versuche ich gerade die 'Null' an eine öffentliche Methode zu übergeben, damit ich die Abwesenheit von Arbeitsmappe oder ein Arbeitsblatt dort behandeln kann. Auf diese Weise kann ich diese spezielle Ausnahme nur einmal behandeln, indem ich den Benutzer auffordere, eine gültige Datei auszuwählen. Dies reduziert die Unordnung im Code und hat auch gehört, dass das Verringern von "Versuch-Fang" in der Leistung besser ist. – swdon

Antwort

1

Ich denke, es gibt keine feste Regel dafür. Aber ich würde null von der ersten Methode zurückgeben, wenn eine Null zurückgegeben wird, wo keine Arbeitsmappe scheint, bedeutet voll wie null repräsentiert kein Objekt, aber von der zweiten Methode leere Liste wäre eine Batter-Option wie bei der Liste, die wir Count verwenden, bevor wir sie anstelle von null verwenden oder iterieren über Liste usw. Dies gilt auch für Konventionen wie ToList wird die Liste der Null-Elemente zurückgeben, anstatt null zurück zu geben.

Return null auf unbekannte Ausnahmen von einer Methode in C# zu vermeiden

Es könnte anders sein, um die Anrufer-Methode zu sagen, dass Fehler in aufgerufenen Methode aufgetreten und Ausnahme ist einer von denen und weithin angenommen. Sie können die Methode dokumentieren, um festzustellen, wann die Art der Ausnahme von der Methode erwartet wird. Schauen wir uns die Dokumentation von String.Substring Method (Int32, Int32) auf MSDN an. Die Dokumentation erwähnt, dass diese Methode ArgumentOutOfRangeException durch konnte, wenn start und Länge eine Position angibt, nicht in diesem Beispiel, oder start oder Länge kleiner als Null ist, MSDN

+0

Danke für Ihre sehr klare Erklärung Adil. Ich habe versucht, meinen Code entsprechend deiner Erklärung zu ändern. Lass es mich wissen, wenn das akzeptabel ist. Vielen Dank. – swdon

+0

Es wäre besser, modifizierten Code als Teil Ihrer Frage hinzuzufügen, indem Sie Ihre Frage anstatt der Antwort bearbeiten, die Sie unten gegeben haben. Wenn die Open-Methode null/exception zurückgibt, wenn die Datei nicht geöffnet werden konnte, ist es in Ordnung? Andernfalls ist die vorherige Methodendefinition in Ordnung. Sie müssen die zweite Methode ändern, indem Sie die Liste gemäß meinem Vorschlag zurückgeben. Um die String-Liste zurückzugeben, können Sie ToDeleteSOs außerhalb deklarieren, wenn Sie darauf zugreifen. Auf diese Weise haben Sie nur eine Rückgabeanweisung ToDeleteSOs außerhalb, wenn. – Adil