2015-09-15 11 views
5
static void Main(string[] args) 
{ 
    try 
    { 
     Console.WriteLine("No Error"); 
    } 
    catch (DataException) /*why no compilation error in this line?*/ 
    { 
     Console.WriteLine("Error...."); 
    } 
    Console.ReadKey(); 
} 

コードはエラーなしでコンパイルされています。 catchブロックの最初の行は、コンパイル・エラーを与えていない理由を私は理解していない -C#catch(DataException) - 変数が定義されていません

キャッチ(DataException)catchブロックの

DataExceptionパラメータはクラスであり、それは次の変数を持っている必要がありますがそのように -

キャッチ(DataException d)は

誰かが上記の動作を説明できますか?

+1

これは、どのタイプの例外が発生してもスタックトレースなどは必要ない場合に有効な構文です。 – Blorgbeard

+0

'd' – Eric

答えて

5

セクション8。

キャッチ節:
       特定キャッチ節           一般  C# 5.0 specの10、あなたはtry/catch(フォーマットについて謝罪)の構文の定義を見つけることができます - 句節 opt
       特定のキャッチ節オプト    一般-キャッチ節
特定キャッチ節:
       特定キャッチ節
       特定キャッチ節       特定キャッチ節
特定のキャッチ句:
        catch         (        クラス型       識別子 OPT         )        ブロック
一般キャッチ句:
        catch        ブロック

だから、そのcatch { }catch (Exception) { }catch (Exception ex) { }は、すべての仕様に応じて有効で見ることができます。

catchブロックにオプションの識別子を指定しないと、例外の詳細にアクセスすることができませんが、時にはその必要はありません。そのため、変数を宣言しないとよいです。アクセスしようとしています。

2

catchは方法ではありません。タイプの横にパラメータは必要ありません。パラメータなしで型を持つだけの場合、その特定の型の例外はそのcatchブロックで処理されますが、詳細は無視されます。

catch (DataException)では、例外の種類を知ることができますが、詳細を知ることはできません。

たとえば、私はメッセージをフォーマットするためにカスタム例外を書き、Messageをオーバーライドしています。 catch (ExceptionType)で、あなたはd.Message

2

あなたが現在書かれている方法、それはあなたがタイプDataExceptionの例外がスローされますと、そのコンパイラを言っていることを意味し、このcatchブロックを使用してアクセスすることができ、message.with catch (ExceptionType d)アクセスすることはできません処理する必要があります。そしてあなたが書いた方法で、あなたが後でアクセスできるように例外が格納されている変数はありません。

通常、1行のコード(行のブロックさえも)は、複数のタイプの例外をスローできます。 Exceptionの種類ごとに異なる処理が必要です。

関連する問題