2017-09-08 13 views
-5

ファイル名の配列があります。配列にファイルがない場合は、例外をスローする必要があります。試してみることもできます。誰でも助けてください。事前に感謝します。C#条件チェックはtry catchを使用します

string[] fileEntries = Directory.GetFiles(filepath, "*.csv");. 
// throw an exception if no files 
    if (fileEntries.Length == 0){} 
+4

例外をキャッチすることは、それをスローすることとは逆です。また、単に「C#例外をスローする」を検索すると、多くの例が見つかります。 – Rob

+0

も参照してください:[例外と例外処理](https://docs.microsoft.com/dotnet/csharp/programming-guide/exceptions/) – Corak

答えて

4

私は、try/catchブロックが例外をキャッチし、その情報で何かをするためであるトライキャッチ

を使用exception.Canをスローする必要があります。あなたが例外をスローする必要がある場合は、単に

if (fileEntries.Length == 0) 
{ 
    throw new Exception("No *.csv files available"); 
} 

それを投げるこの例外は、今のコードのこの部分が配置されているメソッドを呼び出したメソッドに上向きにスローされます。 try/catchブロックを使用して、この例外をキャッチして情報を使用するレベルを決定できるようになりました。 method1に上向きに移動し、実行から、あなたのプログラムを停止/大幅にそれを中止します。この例外をキャッチしない場合

void method1(){ method2(); } 

void method2(){ method3(); } 

void method3() 
{ 
    string[] fileEntries = Directory.GetFiles(filepath, "*.csv");. 

    if (fileEntries.Length == 0) 
    { 
     throw new Exception("No *.csv files available"); 
    } 
} 

。 (たとえば、あなたがコンソールアプリケーションを持っている場合)あなたは、ユーザに情報を提示し、このレベルでそれをキャッチし、することができます

void method1() 
{ 
    try 
    { 
     method2(); 
    } 
    catch(Exception ex) 
    { 
      Console.WriteLine(ex.Message); 
    } 
} 

私はさらにチェック

ためにデータを追加することを除いて、objを元に渡すことができます

は、それはあなたが情報のソース、または内部例外としてadditional exceptionとしてstringを渡すことができます基本的なExceptionのコンストラクタを見てみましょう。

EDIT:

あなたはCorakにより示唆されるように、独自のcustom exceptionを作成する場合。あなたはあなた自身のコンストラクタを定義し、エラーコードの例enumのために渡すことができます。method3で今

public enum ErrorCodes 
{ 
    E1, 
    E2, 
    S4, 
    P5 
} 
public class MyObjectTransferException : Exception 
{ 
    public object ErrorCode { get; set; } 

    public MyObjectTransferException(string message, ErrorCodes code) : base(message) 
    { 
     this.ErrorCode = code; 
    } 
} 

あなたは例外のまさにこのタイプをスローします:

void method3() 
{ 
    string[] fileEntries = Directory.GetFiles(filepath, "*.csv");. 

    if (fileEntries.Length == 0) 
    { 
     throw new MyObjectTransferException("No *.csv files available", ErrorCodes.E1); 
    } 
} 

method1であなたがする必要があるだろうほんの一例

void method1() 
{ 
    try 
    { 
     method2(); 
    } 
    catch(MyObjectTransferException ex) 
    { 
      Console.WriteLine(ex.Message); 
      Console.WriteLine(ex.ErrorCode); 
    } 
} 
+0

答えがありがとうございます。私は例外を除いてex objを渡すさらなるチェックのためのデータ? –

+0

@John_Snow少し詳しく説明できますか?あなたが何をしようとしているのかは不明です。 – Fildor

+0

私は例外タイプごとにエラーコードを追加したいと思います。メールサーバがex.data.add( "Error"、E1)を使用してexオブジェクトの値を渡したいのなら、 –

0

例外のまさにこのタイプをキャッチ
if (fileEntries.Length == 0) 
{ 
    throw new ArgumentException("FileNames array must not be empty!"); 
} 

どのような種類の例外を投げるかを決める必要があります。 fileEntriesが...

しかしあなたのメソッドのパラメータだった場合ArgumentExceptionが大丈夫だろう:私はしたいと思い、このようにそれをしないお勧めします。あなたは成功/失敗、例えばエラーコードを返すことができます。それをチェックすることは、クライアント側でtry/catchよりも安価です。また、制御フローの例外を使用することは一般的には面倒です。

詳細については、https://softwareengineering.stackexchange.com/a/189225を参照してください。