例外処理

<font color="limegreen">モチベーションも大事だと思うので覚書として使用します。</font>
<font color="DarkSlateGray"><details><summary>感想</summary><div>例外はC#7からswitchで使う方法もあるらしくプロパティやenumで複数処理する必要がある場合に使えると思うが、
それだけのエラー数毎の作成は骨が折れると思いました。
端折ってばかりですが…DB扱う際実践的にやっていこうと思います。理想はサクッと仕様だけメモって自作出来ればいいけど、なかなかうまく行かない☂
モチベも落ちたので一旦切り替えて年内は通訳関係の事業計画書製作に専念したいと思います。
</font></details></div>

<img src = https://northconcepts.com/blog/wp-content/uploads/2013/01/6-tips-to-improve-your-exception-handling.jpg width = 300 ％>


<br>

#<font color="SlateGray">例外処理
例外が投げられた(発生した)時に行う処理です。
分岐としても使えますが重いので普通は使いません。
初期プログラミング界では大半がこの例外処理だったそうです。
(その時代じゃなくてよかった…)


<details><summary>[以前行った](https://qiita.com/h_okabe/items/a5f3f454ae0976917aed#%E3%83%A6%E3%83%BC%E3%82%B6%E5%85%A5%E5%8A%9Breadline%E3%81%A8%E6%96%B0%E8%A6%8F%E4%BF%9D%E5%AD%98%E3%81%A8%E4%B8%8A%E6%9B%B8%E3%81%8D%E4%BF%9D%E5%AD%98)既定値外例外処理コード</summary><div>

```c#
            // 既定値外
            int numOfTesters = exNo;

            // 文字は代入されずwhileへ、既定値外は代入されwhileへ、既定値は代入されwhileパス
            if (int.TryParse(Console.ReadLine(), out var nType))
            { numOfTesters = nType; }


            while (numOfTesters < 0)
            {
                Console.Write("retype. ");
                if (int.TryParse(Console.ReadLine(), out nType))
                    numOfTesters = nType;
            }
```

</details></div>

<font color="crimson">このように、例外を処理できます。`if while`で既定値以外の既定値外と文字を処理してループにしました</font>




















<br>
##<font color="DimGray">例外処理用の構文</font>



###<font color="DimGray">1.try catch</font>
例外処理の定番、`try{例外123...} catch{処理}`
また`catch`に`when`付けれるようなった(例外処理同じならまとめてcatch)
`catch (Exception e) when (e is ArgumentNullException || e is ArgumentOutOfRangeException)`

事前知識:



```c#:セット
using System.IO; //読み書き

Console.WriteLine(strmRdr.ReadToEnd()); //内容をすべて読み込む
strmRdr.Close(); ////.ReadToEnd後関連付けられたすべてのシステムリソースを解放 
```
```c#:例外エラーメッセージそのまま表示
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
```



<details><summary>基本的なコード例をここに示します</summary><div>

```c#
using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.Write ("fileパス指定 ");
                StreamReader strmRdr = new StreamReader(Console.ReadLine());
                Console.WriteLine(strmRdr.ReadToEnd()); //内容をすべて読み込む
                strmRdr.Close(); ////.ReadToEnd後関連付けられたすべてのシステムリソースを解放 
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


        }

    }
}
```



![image.png](https://qiita-image-store.s3.amazonaws.com/0/252588/262a1ffc-a9c1-81eb-c5e2-ccef63de5653.png)

</details></div>

<details><summary>try catchせずパス間違った場合エラー</summary><div>

```c#
using System;  
using System.IO;  
namespace ConsoleApplication1 {  
    class Program {  
        static void Main(string[] args) {  
                Console.Write ("fileパス指定 ");
                StreamReader strmRdr = new StreamReader(Console.ReadLine());
                Console.WriteLine(strmRdr.ReadToEnd()); //内容をすべて読み込む
                strmRdr.Close(); ////.ReadToEnd後関連付けられたすべてのシステムリソースを解放
        }  
    }  
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/252588/92818eca-97d3-ed22-bb42-c00bea05810d.png)


</details></div>

<font color="crimson">このように、`try` `catch`でファイルが存在しない場合のエラーを処理できました</font>
















###<font color="DimGray">2.Exception class/member</font>
Exception classは、例外メッセージを取得するライブラリです。
使用する際は<font color="crimson">シリアル化(エラーメッセージや設定ファイルの転送や保存)</font>するといい。

主なExceptionクラスとメンバ Best 5

```c#
catch(FileNotFoundException ex){//存在しないファイル}
catch(NullReferenceException ex){//nullのオブジェクトを操作した}
catch(DivideByZeroException ex){//0による除算}
catch(IndexOutOfRangeException ex){//配列境界こえた}
catch(Exception ex){//その他の例外}

{Console.WriteLine(ex.Message);}//例外に関するメッセージ
{Console.WriteLine(ex.Source);}//発生源のアプリやファイル名
{Console.WriteLine(ex.HelpLink);}//その例外に関するヘルプリンク
{Console.WriteLine(ex.StackTrace);}//処理メソッド説明(デバッグ情報でスタックトレース(スタックの追跡))
{Console.WriteLine(ex.TargetSite);}//例外発生した部分表示

//1つの処理で複数例外でる場合、throwで別のメソッドに再スローすればいい
//逆に複数処理で1つの例外でる場合、whenでまとめればいい
```

<br>
memo: いずれ学習する他の例外処理
async，await，Await in catch and finally blocks
</br>