2011-11-01 26 views
5

CreateFileのようないくつかのWindows関数は、GetLastErrorが呼び出されたときにGetLastErrorの巨大なのさまざまなエラーコードを返す可能性があり、すべてのエラーコードをチェックするのは実用的ではありません。どのエラーを処理する必要がありますか?どちらが「致命的」ですか?

それらの一部(アクセス違反や無効なパラメーターなど)はプログラマーのエラーによるもので、プログラムの実行の継続を許可すべきではありません。しかし、他の要因は、ファイルのパーミッションの悪化、共有違反、悪いファイル名など、開発者がほとんどまたはまったく制御できない他の要因によるものです。

「重大なエラー」(アクセス違反など)でプログラムがクラッシュするのを許しながら、「重要ではない」エラー(悪いファイル名など)をすべて処理したいと考えています。

理想的には、私は言っているでしょう:

// ... an error occurred. Is it a programmer error? 

if (IsErrorCritical(GetLastError())) 
{ 
    // Yes; raise an exception, crashing the program. 
    RaiseException(GetLastError(), 0, 0, NULL); 
} 

どのようなエラーコードを抑制することができます(たとえば、ディスク上のファイルを列挙するとき) ?

+2

私は、プログラムが本当に例外的な状況(アクセス違反など)を除いて決してクラッシュしてはならないと主張します。ファイルの作成に失敗した場合は、予期せぬ障害であり、適切な方法で処理する必要があります。また、新しいエラーコードが追加されるとすぐに、IsErrorCritical()関数が古くなってしまいます。 – Luke

+0

ですが、何か「本当に例外的な」ものがあるかどうかはどうすればわかりますか?それは質問です.. – Mehrdad

+0

私が例外的と言うとき、私はそれを正確に意味します。アクセス違反とメモリ不足は2つの大きな問題です。他にもあるかもしれないが、あなたはそのアイデアを得る。 CreateFile()が失敗してプログラムがクラッシュすると、間違ったIMHOが実行されます。 – Luke

答えて

3

私は本当に文脈に依存していると思うのですが、一般的にこれを決定することは不可能です。代わりにそれを決定する必要があります。

私が言う理由は、同じエラーコードが別のコンテキストになることがあるため、エラーコード自体が重要であるかどうかを判断するために使用できるものではなく、コンテキスト自体です。

4

「クリティカル」は、ファイルの処理内容によって異なります。

エラーコードは、プログラマーエラーまたは実行中のマシン上の例外的なもののいずれかである可能性があります。私はそれがエラー処理の重要な区別ではないと思います。

具体的には処理しないエラー(「不明」のエラー)については、ファイルが作成されていないと仮定し、そのケースを処理します。なぜそれが作成されなかったのかは問題ではなく、それがそうではないと仮定し、そのシナリオを説明します。あなたのコードが何をしているのか、このシナリオにどれくらいの努力を払うべきなのかによって、それは致命的であるかどうかではありません。

アクセス違反はGetLastError()が知っているものではないので、私はあなたの質問との関連性を理解していません。

+0

実際、私は* GetLastErrorからアクセス違反を受け取りました。もちろん 'CreateFile'ではなく、他の関数からのものです(残念なことに、どちらが覚えていないか)。しかし、とにかく良い点、+1。 – Mehrdad

+0

「getlasterrorからアクセス違反が戻ってくる」とはどういう意味ですか? – tenfour

+0

これは、GetLastErrorから返された 'ERROR_NOACCESS'を受け取ったことを意味しますが、私はそれがどのような機能を持っているのか覚えていません。 – Mehrdad

関連する問題