「Try」はC#メソッド名でいつ使用されることになっていますか?


180

メソッド名が「Try」で始まる場合の意味について、同僚と話し合っていました。

以下の意見がありました:

  • メソッドがnull値を返す可能性がある場合は、「試行」を使用します。
  • メソッドが例外をスローしない場合は、「試行」を使用します。

公式の定義は何ですか?メソッド名で「試してみる」とは何ですか?これに関する公式のガイドラインはありますか?


83
+1機能の名前にこれほど多くのことを考慮した人々は、実際には「次の人」を探しています。なぜこれが近い票を獲得しているのかわからない(そしてそれは今夜多くの人を投じている男から来ている。)
Jonathon Reinhart

7
@JonathonReinhartは、
Pranav Hosangadi 2013年

16
そこ質問に答えるマイクロソフトの公式声明は、(私の答えを参照してください)。それは事実ではないのですか?
Erik Schierboom 2013年

6
Erikが言及した@PranavHosangadiは、事実によってサポートされています。また、有効な回答を提供するための特定の専門知識を持つ非常に経験豊富なC#開発者がここにたくさんいます。地獄、エリックリッパーはC#言語のチーフアーキテクトです。その特定の専門知識を呼び出すことができると思います。
Jonathon Reinhart

4
@ErikSchierboom MSガイドラインだというのは事実です。MSガイドラインが正しいガイドラインであることは主観的であり、議論の余地があります。
サービー2013年

回答:


148

これは、TryParseパターンと呼ばれ、Microsoftによって文書化されています。公式の例外とパフォーマンスMSDNページは言います

例外に関連するパフォーマンスの問題を回避するために、一般的なシナリオで例外をスローする可能性があるメンバーのTryParseパターンを検討してください。

したがって、通常のユースケースで例外がスローされる可能性がある(intの解析など)コードがある場合、TryParseパターンは理にかなっています。


2
このパターンを記録する別の便利なリンク(TryParseを検索)blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx
Vivek Maharajh

2
基本的に、TryParseメソッドがある場合、TryParseがfalseを返すとスローされるParseメソッドが必要です。逆に、Parseメソッドがある場合は、Parseがスローしたときにfalseを返すTryParseメソッドを
用意

5
+1。これに加えて、例外は一般に「例外的な」状況のためのものです。簡単に失敗する可能性があり、その失敗が特に顕著ではない場合、このパターンの使用は、try / catchよりも慣用的です
Adam Robinson

そのようなパターンは本当にマイクロソフトからのガイドラインを必要としましたか?かなり基本的なもののようです。
Dave Lawrence

19
それはある基本的なもの、それはガイドラインが有用でないことを意味するものではありません。プラットフォームを十分に理解していないと、基本的なものを正しく理解するのが非常に難しくなる場合があります。
Erik Schierboom 2013年

119

(修正)エリックが示唆したように、公式のガイドラインがあります。

TrySomething方法を見たらそれとする

  • 投げません
  • 戻り値 bool
  • 値を期待している場合は、 'out'パラメータを介して返されます
  • Something例外を自分で処理できるメソッドが存在します。(編集、Jesse Webbにより提案)

4
訂正-公式ガイドラインがあります。エリックの答えを見てください。
nothrow 2013年

8
+1しかし、私は4番目の期待も持っています:TryFooメソッドがある場合、Foo自分で ``例外を処理できる同様のメソッドがあります。これらのメソッドのシグネチャは異なる可能性が高いため、他のコードを変更しない限り、その使用法は交換できません。
Jesse Webb

1
@JesseWebb、指摘してくれてありがとう。よろしければ、私の回答にコメントを追加しました。
nothrow 2013年

1
「投げない」は私には一般化されているようです。たとえば、Int32.TryParse(String、NumberStyles、IFormatProvider、Int32)は、スタイルパラメータが気に入らない場合、ArgumentExceptionをスローします。
Jirka Hanika、2018

「スローしない」は一般化されていると見なすことができることに同意しますが、その意図は、パラメーターの値の結果としてではなく、実行の結果としてスローしないことを伝えることであったと思います。
ConfusingBoat

8

try続行したい場合に使用するとよいと思います。メソッドが値を返すかどうかは関係ありません。

ケース1:正常に戻る場合は、何らかの方法で続行できます。

ケース2:戻らない場合:それでも問題ありません。他の方法で続行できます。

また、そのメソッドの出力として何らかの値を期待する場合は、outパラメーターを使用します。

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}

6

メソッド呼び出しで無効な結果が生成される可能性があることを明示したい場合は、メソッド名に「Try」を使用する必要があります。道ではなく、例外が発生し機能が、一部を返す関数で、それはだ.NETの標準に続いてVALIDか、NON_VALIDプログラムの観点からは、値。

最後に、これは、グループで使用することにした命名規則に関するすべてです。


5

次のtry場合は、必ずメソッド名に含めてください。

  • あなたはどんな例外も投げません
  • メソッドには次の署名があります。 bool TrySomething(input, out yourReturn)

つまり、基本的にtry-methods を使用すると、ブール値の結果のみが返されます。

したがって、次のコードは例外をスローしません。

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

一方、このコードは例外をスローできます(この場合はスローされます)。

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

Tryメソッドを使用すると、より安全で防御的な方法でコーディングできます。また、コードスニペット#2は、整数ではない場合、実行にパフォーマンスがかかります。


int number = int.Parse(input);このコンテキストでより意味を持たせたい場合は、コードスニペット#2を読む必要があります。
Pierre Arnaud 2013年

@PierreArnaudありがとう、変更しました!
Fabian Bigler 2013年

int number;tryブロックとnumber = ...割り当ての前の宣言がまだありません。
Pierre Arnaud 2013年

@PierreArnaudありがとうございます。「int番号」も含めました。
Fabian Bigler 2013年

例外がTryLoadFile(path, out file)RAMの外で実行されている直接動作と多少関係がない場合でも、例外をスローする可能性があることに注意してください。そのため、呼び出し側は、不正なパスやアクセスが拒否されてもエラーは発生しないと予想しますが、異常が発生する可能性のある異常なものについては例外です。そしてそれを文書化します。
ルークPuplett

0

ボブおじさんは、彼の本「Clean Code」で以下の例を挙げています。例外がスローされることが予想される場合は常にTry、メソッド名にプレフィックスを使用できます。

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);            
    }
}

そして(適応):

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

これはtryToShutDownメソッドの責任であるため、メソッドはエラー処理を行いませんsendShutDown

TryParseMicrosoft のパターンは、出力パラメーターを回避する必要があると明記された明確なコードガイドラインに違反しています。

C#の新しいバージョンを開発していない場合、Microsoftのガイドラインすべてに固執する必要はありません。時には彼らは最高ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.