web-dev-qa-db-ja.com

try catchが最終的にブロックを動作させる方法は?

C#、try catchは最終的にどのように動作をブロックしますか?

したがって、例外がある場合、catchブロックにジャンプして、finallyブロックにジャンプすることがわかります。

しかし、エラーがない場合、catchブロックは実行されませんが、finallyブロックは実行されますか?

48
omega

はい、finallyブロックは例外の有無にかかわらず実行されます。

 Try 
 [tryStatements] 
 [Tryを終了] 
 [Catch [exception [As type]] [When式] 
 [catchStatements] 
 [終了する]] 
 [キャッチ...] 
 [最後に
 [finallyStatements]]-常に実行する
終了する

参照: http://msdn.Microsoft.com/en-us/library/fk6t46tz%28v=vs.80%29.aspx

45
James Hill

はい、例外がない場合、finally句が実行されます。例を挙げる

     try
        {
            int a = 10;
            int b = 20;
            int z = a + b;
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            Console.WriteLine("Executed");
        }

そのため、ここで例外が発生した場合、最終的に実行されます。

12
Sohail

Catchとfinallyの一般的な使用法は、tryブロックでリソースを取得して使用し、catchブロックで例外的な状況に対処し、finallyブロックでリソースを解放することです。

再スロー例外の詳細と例については、 try-catch および Throwing Exceptions を参照してください。 finallyブロックの詳細については、 try-finally を参照してください。

public class EHClass
{
    void ReadFile(int index)
    {
        // To run this code, substitute a valid path from your local machine 
        string path = @"c:\users\public\test.txt";
        System.IO.StreamReader file = new System.IO.StreamReader(path);
        char[] buffer = new char[10];
        try
        {
            file.ReadBlock(buffer, index, buffer.Length);
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
        }

        finally
        {
            if (file != null)
            {
                file.Close();
            }
        }
        // Do something with buffer...
    }

}
5
Alex Jolig
        try
        {
            //Function to Perform
        }
        catch (Exception e)
        {
         //You can display what error occured in Try block, with exact technical spec (DivideByZeroException)
            throw; 
            // Displaying error through signal to Machine, 
            //throw is usefull , if you calling a method with try from derived class.. So the method will directly get the signal                
        }

        finally  //Optional
        {
            //Here You can write any code to be executed after error occured in Try block
            Console.WriteLine("Completed");
        }
0
Balaji

最終的にブロックは常に実行されます。この方法を試してください

     public int TryCatchFinally(int a, int b)
    {
        try
        {
            int sum = a + b;
            if (a > b)
            {
                throw new Exception();
            }
            else
            {
                int rightreturn = 2;
                return rightreturn;
            }
        }
        catch (Exception)
        {
            int ret = 1;
            return ret;
        }
        finally
        {
            int fin = 5;
        }
    }
0
Rohan M Nabar