2

Code Complete で、フロー制御に例外を使用してはならないことを読みました。また、一般的なアドバイスは、例外を使用して「例外的なケース」を処理することであることも知っています。しかし、このアドバイスをどのように適用すればよいかわかりません。コンストラクターで無効なパラメーターをチェックするために例外を使用することは良い考えですか? たとえば、スプレッドシートの行を (操作のために) Record オブジェクトに変換する ExcelInputConverter があります。コンストラクターは、Excel ファイルの名前を入力として受け取ります。受信文字列が有効な Excel ファイルであることを確認するために例外を使用する必要がありますか? エクセルファイルが存在すること?ここで例外を使用する必要があるようです。これが発生すると、クラスは本質的に機能できなくなります。

クラス内またはクラス外の無効なデータをチェックすることは良い考えですか?

Public Sub New(filename as string) 'new excel input converter
      If Not (Path.GetExtension(fileName) = ".xls" Or Path.GetExtension(fileName) = ".xlsx") Then Throw New Exception("Can't make an Excel input converter from a non-Excel file like " & inputFileName)
      If Not (File.Exists(fileName)) Then Throw New Exception("This file does not exist. Can't make an Excel converter")
4

2 に答える 2

3

コンストラクターへの無効な引数が原因でオブジェクトを構築できない場合は、例外が適切です。ほとんどの言語は、何かがうまくいかなかったことをオブジェクトの作成者に伝えるための別の手段を提供していません (オブジェクトに「無効」フラグを設定することはお勧めしませんが)。

.NET は、このタイプの状況に対してArgumentExceptionを定義します。

クラス内またはクラス外の無効なデータをチェックすることは良い考えですか?

クラスは、どのデータが有効かを知るのに最適な位置にあります。クラスが時間の経過とともに進化し、有効なデータのルールが変更された場合、そのクラスを使用するすべてのコードを変更してその変更を反映する必要はありません。

于 2012-06-28T18:41:47.537 に答える
0

私は最後の手段として例外を使用する傾向があります。ファイルチェックのようなもののために、私はします:(PsuedoCode)

try
{
    fileToCheck = getUserInput();
    while(!fileToCheck.Exists() && quit==false)
    {
        Console.WriteLine("File does not exist. Make sure the path and filename are correct.");
        quit = getQuitInput();
        fileToCheck = getUserInput();
    }
    // fopen(fileToCheck) and other processes. Include other sub-try/catch blocks as needed.
}
catch (Exception e)
{
    Console.WriteLine("Fatal Error Occurred. Check Log files for information.");
    logError(e);
}

このようにして、ユーザーは発生する可能性のある独自のユーザーエラーの問題を修正しようと試みることができ、修正できない(Excelファイルが破損するなど)より複雑な場合にのみプログラムが終了します

于 2012-06-28T18:46:47.753 に答える