C/C++ などの他の言語では、メソッドが正常に返されたか失敗したかを呼び出し元のメソッドに示す SUCCESS のような値を返すことを知っています。
SUCCESS 戻り変数を必要とせずに C# でこれを行う「良い」方法はありますか? 例外をスローすることが頭に浮かびますが、これをどのように実装するかはわかりません。独自のエラー メッセージでスローできるカスタム例外はありますか?
サンプルコードは大歓迎です。
前もって感謝します。
C/C++ などの他の言語では、メソッドが正常に返されたか失敗したかを呼び出し元のメソッドに示す SUCCESS のような値を返すことを知っています。
SUCCESS 戻り変数を必要とせずに C# でこれを行う「良い」方法はありますか? 例外をスローすることが頭に浮かびますが、これをどのように実装するかはわかりません。独自のエラー メッセージでスローできるカスタム例外はありますか?
サンプルコードは大歓迎です。
前もって感謝します。
1)失敗が「例外的」でない限り、例外を使用することはお勧めしません。たとえば、それは失敗しました、そしてそれは処理される必要がある何かを意味します。それらは「false」タイプの戻りよりも遅いです。
2)なぜ戻り値を避けようとしているのですか?戻り値がない必要がありますか?
メソッドがvoid
の場合、例外をスローせずに返されたという事実は成功と見なされます。
メソッドがvoid以外の場合、特定の戻り値は失敗した実行として解釈される可能性があります。次に例を示します。
bool
メソッドを返すfalse
null
フロー制御または「成功」の表示に例外を使用しないでください。
戻りパラメーターに加えて成功または失敗のインジケーターが必要な場合はout bool
、メソッドシグネチャでパラメーターを使用できます。
public SomeObject DoingSomethingHere(out bool success)
{
}
if (!success)
{
// some compensating action
}
bool
データ型を参照していますか?
関数定義の例:
public static bool DoSomething()
{
if ( some || condition )
return true;
else
return false;
}
使用例:
public static void main()
{
if ( DoSomething() )
Console.WriteLine( "SUCCESS" );
else
Console.WriteLine( "FAILURE" );
}
戻り値または例外を使用せずにメソッドが正常に完了しなかったことを示したいようです。out bool
パラメータはどうですか?
public void Execute(out bool success) {
try {
//...
success = true;
} catch {
success = false
}
}
私はこれを行うことをお勧めしませんが、あなたが尋ねたので....
例外をスローしないことが私の頭に浮かぶ方法です...
関数からメッセージを取得するには、基本的に4つの方法があります。
予期せず問題が発生した場合は、例外をスローします。何かが常に機能しないと予想される場合は、戻り値を使用します。
特定の種類の障害については、カスタム例外が確実に有効な方法です。簡単な方法の 1 つは、カスタム ドメインの例外に役立つと思われる特定の情報をDomainException
継承して追加する共通ライブラリ内に、クラス (またはアプリケーションの問題ドメインなどで呼びたいもの)を作成することです。 Exception
. (おそらく特定のコード、標準Exception
では利用できない現在の環境に関する情報など)
そこから、それを継承するより具体的な例外を作成できます。DataIntegrityException
たとえば、メソッドが技術レベルでは意味があるがカスタムのビジネス検証ルールに違反する入力を受け取った場合などにスローされる可能性があります。
Exception から独自の例外を派生させることができます。
bool またはいくつかの数値規則を返すことができます。
C# では、成功/失敗だけでなく製品の出力も返したい場合、ポインターよりも使いやすい出力パラメーターがあります。
私は例外的なものには例外を設ける傾向があります。論理的なものに対する論理的なリターン。つまり、例外を使用してプログラムの操作を制御しないでください。ファイル操作が予期せず失敗した場合は、例外をスローします。アプリがファイルを探す必要があり、通常、通常の操作としてファイルが見つからないことがあると予想される場合、呼び出し元が例外をキャッチすることは期待できませんが、代わりに単純に bool を返し、アプリケーションを介して適切な論理パスを選択します。
列挙、整数、またはブール値などのステータス変数を返すことができます。問題は、呼び出し元がさまざまな戻り値の意味を知らなければならないことです。true は、成功したことを意味する場合もあれば、エラーが発生したことを意味する場合もあります。また、直接の呼び出し元は、呼び出しが失敗した場合に何をすべきかわからない場合があり、呼び出しが失敗したために各メソッドが失敗するため、失敗を「バブルアップ」する必要があります。
Try-throw-catch は、失敗する可能性があることがわかっていることを処理し、失敗した場合に実行フローを制御するための頼りになるパターンです。
public void MightFail()
{
//obviously your code will do something a little more meaningful
if(new Random().Next(2) == 0) throw new Exception("I failed");
return;
}
public void RunRiskyMethod()
{
var failures = 0;
var successes = 0;
var totalRuns = 0;
for(var i=1;i<10000;i++)
{
try
{
MightFail();
//if the previous line throws an exception, the below lines will not execute
successes++;
Console.WriteLine("Success!");
}
catch(Exception) //I didn't name the exception because we don't need its info.
{
//These lines ONLY execute if an exception was thrown from within the try block
failures++;
Console.WriteLine("Failure!");
}
finally
{
//this code ALWAYS executes, even if an exception is thrown and not caught
totalRuns++;
}
}
Console.WriteLine(String.Format("{0} Successes, {1} Failures.", successes, failures);
}