[C 知识回顾

学会使用异常

  异常:指的是我们写的程序在运行时出现了错误,并且它会不断的蔓延、传播和扩散,有点像病毒一样。

  异常通常由错误的代码引发,可能是用户的错误输入,可能是一方没有按照约定来传输格式,也可能是数据传输的过程中被篡改。我们会对自己认为有可能报错的代码进行 catch ,这称为捕获异常。

catch

throw
         /// <summary>

     /// 定义新异常<br/>
     /// &lt;/summary&gt;<br/>
     class MyException : Exception<br/>
     {<br/>
         public MyException(string msg) { }<br/>
     }

/// &lt;summary&gt;

     /// 抛出新定义的异常<br/>
     /// &lt;/summary&gt;<br/>
     static void ThrowMyExcetion()<br/>
     {<br/>
         throw new MyException(&#34;Sorry, this is test!&#34;);<br/>
     }</pre>

  

trytrycatchcatchcatch
         static void Main(string[] args)

     {<br/>
         try<br/>
         {<br/>
             ThrowMyExcetion();  //直接调用抛出异常的方法<br/>
         }<br/>
         catch (MyException e)<br/>
         {<br/>
             Console.WriteLine(e);<br/>
         }

Console.Read();

     }</pre>

trytrycatchtrycatchcatchcatchcatch
trycatchcatchcatch
         static void Main(string[] args)

     {<br/>
         StreamWriter sw = null;

try

         {<br/>
             sw = new StreamWriter(@&#34;C:\book\小二和小三的故事.txt&#34;);<br/>
             sw.Write(&#34;You are 250.&#34;);<br/>
         }<br/>
         catch (FileNotFoundException e)<br/>
         {<br/>
             //将具体的异常放在第一位<br/>
             Console.WriteLine(e);<br/>
         }<br/>
         catch (IOException e)<br/>
         {<br/>
             //将并不具体的放在相对后面的位置<br/>
             Console.WriteLine(e);<br/>
         }<br/>
         catch (Exception e)<br/>
         {<br/>
             Console.WriteLine(e);<br/>
         }<br/>
         finally<br/>
         {<br/>
             if (sw != null)<br/>
             {<br/>
                 sw.Close();<br/>
             }<br/>
         }

Console.Read();

     }</pre>

catchfinallyFinallytry
         static void Main(string[] args)

     {<br/>
         FileStream fs = null;<br/>
         FileInfo fi = new FileInfo(@&#34;小二和小三的故事.txt&#34;);

try

         {<br/>
             fs = fi.OpenWrite();<br/>
             fs.WriteByte();<br/>
         }<br/>
         finally<br/>
         {<br/>
             //记住哦,如果你忘记 close,将会引发 IO 异常!<br/>
             //if (fs != null)<br/>
             //{<br/>
             //    fs.Close();<br/>
             //}<br/>
         }

try

         {<br/>
             fs = fi.OpenWrite();<br/>
             fs.WriteByte();<br/>
             Console.WriteLine(&#34;OK!&#34;);<br/>
         }<br/>
         catch (IOException e)<br/>
         {<br/>
             Console.WriteLine(&#34;Fail!&#34;);<br/>
         }

Console.Read();

     }</pre>

  “Fail!”,这是因为上面注释了需要关闭文件流的语句,你可以尝试下去掉注释看看结果,记住哦,IO 操作都应该在结束时释放资源。 

WriteByte(0)(第9行).Close()tryfinally
catch
  • 如果异常出现在析构函数中,则中止该析构函数并调用基类的析构函数(如果有)。

  • 如果调用堆栈包含静态构造函数或静态字段初始值设定项,则会引发 TypeInitializationException,并将原始异常分配给新异常的 InnerException 属性。

  • 如果到达线程的开头,将会终止线程。

C# 基础回顾系列

  《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》

  《C# 知识回顾 - 事件入门》、《C# 知识回顾 - Event 事件》

【博主】反骨仔

【参考】https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/programming-guide/exceptions/using-exceptions

【参考】微软官方文档