例外処理のベストプラクティスにはいくつか質問があることがわかりましたが、私が見つけたサンプルについていくつか微調整を加えなければなりませんでした。私の目標は、 "ArgumentException"、 "FileNotFoundException"、 "ArrayIndexOutOfBoundsException"などの基本的な例外を取り除くことでした。この例外処理をきれいに書いていますか?
次のコードを階層内に配置することができます。したがって、Process()はCSVData()を呼び出すValidateData()を呼び出します。私は基本的に同じ種類のものを実行しています。は私のカスタム関数を含む既知の関数をすべてラップしてから、そのメソッドの例外に入れて内部の例外として渡します。これはこの仕事をうまくやっていく方法ですか?それは私のために働いていますが、過去の私のプロジェクトが「catch(Exception e)...」と「e.Messageの解析...」でカバーされているので、非常にクリーンな方法で例外を処理する習慣を得たいと思います。 「
ここに私のコード例があります:
public class CSVData
{
DataTable data;
public CSVData(string file)
{
try
{
this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions
}
catch (FileNotFoundException e)
{
throw new FailedLoadingCSVException(e, currentLine, file);
}
catch (IOException e)
{
throw new FailedLoadingCSVException(e, currentLine, file);
}
catch (ArgumentNullException e)
{
throw new FailedLoadingCSVException(e, currentLine, file);
}
catch (ArgumentException e)
{
throw new FailedLoadingCSVException(e, currentLine, file);
}
catch (OutOfMemoryException e)
{
throw new FailedLoadingCSVException(e, currentLine, file);
}
}
class FailedLoadingCSVException : Exception
{
public int failedAtLine;
public FailedLoadingCSVException(Exception e, int failedLine, string file)
:base ("The system failed at loading "+file+" at line "+failedLine, e)
{
this.failedAtLine = failedLine;
}
}
}
本当に問題に関連していないが、 'OutOfMemoryException'をラップしようとしないでください。その例外が発生した場合、アプリケーション全体が不安定な状態になる可能性があるため、実際にデータを損失するリスクよりも、アプリケーションをバブルアップしてクラッシュさせる方が良いでしょう。 – carlosfigueira
新しい例外を投げているのは例外の再マッピングだけなので、例外処理ではありません。どのような非常に頻繁に非常に小さな値である –
なぜ非常に多くの例外..?なぜ基本的な試しキャッチをしないで、例外の使用(例外e)を書くか、e.messageを記録するか、e.InnerExceptionまたはe.TargetSite.ToString()を取得することができます少し過剰のように見える – MethodMan