*์ด ๊ธ์ <์ด๊ฒ์ด C#์ด๋ค> ์ฑ ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๊ธ์ ๋๋ค.
ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ค์ ์ ๋ง ์ฐฝ์์ฑ์ด ๋๋ณด์ด๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ๋ค์ ์ ์ฉํ๊ธฐ๋ ํ๋ค.
์ ์ง ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ ์ฌ์ฉ์์๊ฒ ์ฃผ๋ฌธ์ ๋ฐ์ ์ค๋น๋ฅผ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ค์ด์ค์, ํ์ฅ์ค์ด ์ด๋จ๋๊ณ ๋ฌป์ต๋๋ค.
์ ์ง์ ๋ชจ๋ ๋ถ์ ํ๋ฒ๋ ธ๊ณ , ๊ทธ๋ ๊ฒ ์ ๋ถ ์ฌ๋ผ์ก์ต๋๋ค.
SNS์์ ๊ฐ๋ ๋ณผ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ ๋จธ์ธ๋ฐ, ์ง๊ธ ๋ฑ ๋น์ ํ๊ธฐ ์ ๋นํ ์ํฉ์ธ ๊ฒ ๊ฐ๋ค. ๋ง์ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ๊ณผ ๊ฐ์ ๋ถ๋ถ์์ ์ค๋ฅ๋ ๋ค์ด์ด ๋ฐ์ํ์ ๋, ์ฒ๋ฆฌํด์ฃผ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผํด๋ ์น๋ช ์ ์ผ ๊ฒ์ด๋ค.
์ด๋ ๋ฏ, ํ๋ก๊ทธ๋จ์ด ์ค๋ฅ๋ฅผ ์ผ์ผํค๊ฑฐ๋ ์ฌ์ง์ด ๋ค์ด๊น์ง ์ผ์ด๋์ง ์๋๋ก ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํ์ํ๋ค. ์ด๊ฒ์ ์์ธ ์ฒ๋ฆฌ(Exception Handling)์ด๋ผ๊ณ ํ๋ค.
์์ธ ์ฒ๋ฆฌ (Exception Handling)
๋ฐฐ์ด ๊ฐ์ฒด์ ์๋ชป๋ ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ๋ฉด, ๋ฐฐ์ด ๊ฐ์ฒด๊ฐ ์ด ๋ฌธ์ ์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ IndexOutOfRangeException์ ๊ฐ์ฒด์ ๋ด๋๋ค.
class Program
{
static void Main(string[] args)
{
int[] array = { 1, 2, 3 };
for(int i = 0; i < 5; i++)
{
Console.WriteLine(array[i]); // ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋์ด์๋ ์์ธ๊ฐ ๋ฐ์ํจ
} // ์์ธ๊ฐ ๋ฐ์ํ ๋ถ๋ถ ์ดํ์ ์ฝ๋๋ค์ ์คํ๋์ง ์์
Console.WriteLine("ํ๋ก๊ทธ๋จ ์ ์ ์ข
๋ฃ"); // ์คํ๋์ง ์์
}
}
๊ทธ๋ฆฌ๊ณ ํธ์ถ์(Main() ๋ฉ์๋)์๊ฒ ๋์ ธ์ง๊ฒ ๋๋๋ฐ, Main() ๋ฉ์๋๋ ์ด๋ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด ์๋ค.
์์ธ๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ์์ธ๋ ๋ค์ CLR์๊ฒ ๋์ ธ์ง๊ฒ ๋๊ณ , CLR๊น์ง ๋์ ธ์ง๊ฒ ๋ ์์ธ๋ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๊ฐ ๋๋ค. CLR์ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๋ฅผ ๋ฐ๊ฒ ๋๋ฉด, ์์ธ ๊ฐ์ฒด์ ๋ด๊ธด ๋ด์ฉ์ ์ถ๋ ฅํ ํ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ข ๋ฃํ๋ค.
ํ๋ก๊ทธ๋จ ๊ธฐ๋ฅ์ด ์๋ฌด๋ฆฌ ๋ง๋๋ผ๋, ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ํด๋์ง ์์ผ๋ฉด ์ ๋ขฐํ ์ ์๋ ํ๋ก๊ทธ๋จ์ด ๋๋ค.
์ด๋ป๊ฒ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋์ง ๋ค์ ์ ์์ ์ดํด๋ณด์.
try ~ catch๋ก ์์ธ ๋ฐ๊ธฐ
try
{
// ์คํํ๊ณ ์ ํ๋ ์ฝ๋
}
catch ( ์์ธ ๊ฐ์ฒด1)
{
// ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ฒ๋ฆฌํ ์ฝ๋
}
catch ( ์์ธ ๊ฐ์ฒด2)
{
// ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ฒ๋ฆฌํ ์ฝ๋
}
try ์ ์ ์ฝ๋ ๋ธ๋ก์๋ ์์ธ๊ฐ ์ผ์ด๋์ง ์์ ๊ฒฝ์ฐ ์คํ๋์ด์ผํ ์ฝ๋๋ค์ด ๋ค์ด๊ฐ๋ค.
catch ์ ์ ์ฝ๋ ๋ธ๋ก์๋ ์์ธ๊ฐ ๋ฐ์ํ์ ๋์ ์ฒ๋ฆฌ ์ฝ๋๋ค์ด ๋ค์ด๊ฐ๋ค.
try ์ ์์ ์๋ ์คํํ๊ณ ์ ํ๋ ์ฝ๋๋ฅผ ์ญ ์ฒ๋ฆฌํด๋๊ฐ๋ค๊ฐ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด, catch ๋ธ๋ก์ด ์ด ์์ธ๋ฅผ ๋ฐ์๋ธ๋ค.
์ด๋, catch ์ ์ try ๋ธ๋ก์์ ๋์ง ์์ธ ๊ฐ์ฒด์ ํ์์ด ์ผ์นํด์ผ ํ๋ค.
catch ์ ์์ ์์ธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๋ก ๋จ๊ฒ ๋๋ฉฐ, try ์ ์์ ์ฌ๋ฌ ์ข ๋ฅ์ ์์ธ๋ฅผ ๋์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด catch ์ ๋ธ๋ก์ ์ฌ๋ฌ ๊ฐ ๋ ์๋ ์๋ค.
class Program
{
static void Main(string[] args)
{
int[] array = { 1, 2, 3 };
try
{
for(int i = 0; i < 5; i++)
{
Console.WriteLine(array[i]);
}
}
catch(IndexOutOfRangeException e)
{
Console.WriteLine($"์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค : {e.Message}");
}
Console.WriteLine("ํ๋ก๊ทธ๋จ ์ ์ ์ข
๋ฃ"); // ์์ธ์ฒ๋ฆฌํ์ฌ ์ด์ ์คํ๋จ
}
}
System.Exception ํด๋์ค
๋ชจ๋ ์์ธ์ ์กฐ์ ํด๋์ค์ด๋ฉฐ, C#์์ ๋ชจ๋ ์์ธ ํด๋์ค๋ค์ ๋ฐ๋์ ์ด ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์์ผ ํ๋ค. ์์์ ์ฌ์ฉํ๋ IndexOutOfRangeException ๋ํ Exception ํด๋์ค๋ฅผ ์์๋ฐ์ C#์์ ์ ๊ณตํ๋ ์์ธ ํด๋์ค์ด๋ค. Exception ํด๋์ค๋ ๋ชจ๋ ์์ธ ํด๋์ค๋ค์ ์กฐ์์ด๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์์ธ๋ฅผ ๋ค ๋ฐ์๋ผ ์ ์๋ค.
try
{
...
}
catch(Exception e) // ๋ชจ๋ ์์ธ๋ฅผ ๋ฐ์ ์ ์๋ค
{
...
}
๋ชจ๋ ์์ธ๋ฅผ ๋ฐ์๋ผ ์ ์์ง๋ง, ์ํฉ์ ๋ฐ๋ผ ์ฌ์ธํ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋๊ฐ ์๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ํ ์์ธ ๋ง๊ณ ๋ ๋ค๋ฅธ ์์ธ๋ค๊น์ง ๋ฐ์๋ด๊ธฐ ๋๋ฌธ์ ๋๋ก๋ ๋ฒ๊ทธ๋ฅผ ๋ฐ์ํ๋ ์ฝ๋๋ก ๊ฐ์ฃผ๋ ์ ์๋ค.
/* ๊ฐ๋ น, ๊ทธ ์์ธ๊ฐ ํ์ฌ ์ฝ๋๊ฐ ์๋ ์์ ์ฝ๋์์ ์ฒ๋ฆฌํด์ผ ํ ์์ธ๋ผ๋ฉด,,, */
๋ฐ๋ผ์, ์ฝ๋๋ฅผ ๋ฉด๋ฐํ ๊ฒํ ํด ์ฒ๋ฆฌํ์ง ์์์ผ ํ ์์ธ๊น์ง ์ฒ๋ฆฌํ์ง ์๋๋ก ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.
์์ธ ๋์ง๊ธฐ : throw
try~catch ๋ฌธ์ผ๋ก ์์ธ๋ฅผ ๋ฐ๋๋ค๋ ๊ฒ์ ์ด๋์ ๊ฐ ์์ธ๋ฅผ ๋์ง๋ค๋ ์ด์ผ๊ธฐ๋ค. ์์ธ๋ throw ๋ฌธ์ ํตํด ๋์ง ์ ์๋ค.
try
{
...
throw new Exception("์์ธ ํ ์ค!");
}
catch(Exception e) // throw ๋ฌธ์ ํตํด ๋์ ธ์ง ์์ธ ๊ฐ์ฒด๋ catch ๋ฌธ์ ํตํด ๋ฐ๋๋ค.
{
Console.WriteLine(e.Message);
}
์์ ๊ฐ์ด try~catch ๊ตฌ๋ฌธ ์์์ ์์ธ๋ฅผ ๋์ ธ๋ ๋๊ณ , ๋ฉ์๋ ์์์ ์์ธ๋ฅผ ๋์ง๊ณ ํธ์ถ์ ์ธก์ try~catch ๋ฌธ์์ ๋ฐ์๋ผ ์๋ ์๋ค.
class Program
{
static void Main(string[] args)
{
try
{
DoSomething(13);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
static void DoSomething(int arg)
{
if (arg < 10)
Console.WriteLine("arg : {0}", arg);
else
throw new Exception("arg๊ฐ 10๋ณด๋ค ํฝ๋๋ค.");
}
}
throw๋ ๋ณดํต ๋ฌธ(statement)์ผ๋ก ์ฌ์ฉํ์ง๋ง, C# 7.0๋ถํฐ๋ ์(expression)์ผ๋ก๋ ์ฌ์ฉํ ์ ์๊ฒ ๊ฐ์ ๋์๋ค.
int? a = null;
int b = a ?? throw new ArgumentNullException();
// a๋ null์ด๋ฏ๋ก b์ a๋ฅผ ํ ๋นํ์ง ์๊ณ throw ์์ด ์คํ๋จ
์กฐ๊ฑด ์ฐ์ฐ์์์๋ ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
int array = new[] {1, 2, 3};
int index = 4;
int value = array[ index >= 0 && index < 3 ? index : throw new IndexOutOfRangeException()];
๋๋ ๊ผญ ์คํ๋๋๋ก ๋ณด์ฅํ ๊ฒ! : finally
try ๋ธ๋ก์์ ์ฝ๋๋ฅผ ์คํํ๋ค๊ฐ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด ํ๋ก๊ทธ๋จ์ ์คํ์ด catch ์ ๋ก ๋ฐ๋ก ๋ฐ์ด ๋์ด์จ๋ค. ๋ง์ฝ ์์ธ ๋๋ฌธ์ try ๋ธ๋ก์ ์์ ํด์ ๊ฐ์ ์ค์ํ ์ฝ๋๋ฅผ ๋ฏธ์ฒ ์คํํ์ง ๋ชปํ๋ค๋ฉด ์ด๋ ๊ณง ๋ฒ๊ทธ๋ฅผ ๋ง๋๋ ์์ธ์ด ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ try ๋ธ๋ก ๋ ๋ถ๋ถ์ ์ค์ํ ์ฝ๋๋ค์ ์ ์ง ๋ง๊ณ , ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฐ๋์ ์คํํ๋๋ก ํด์ฃผ๋ finally ๋ธ๋ก์๋ค ์์ฑํด์ผ ํ๋ค. finally ์ ์ try~catch ๋ฌธ์ ์ ์ผ ๋ง์ง๋ง์ ์ฐ๊ฒฐํด์ ์์ฑํ๋ค.
try
{
...
}
catch(Exception e)
{
...
}
finally
{
// ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฐ๋์ ์คํ๋๋ค.
}
์์ ์ด ์์๋ try ์ ์ด ์คํ๋๋ค๋ฉด finally ์ ์ ์ด๋ค ๊ฒฝ์ฐ๋ผ๋ ์คํ๋๋ค. ์ฌ์ง์ด, ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ด ๋ณ๊ฒฝ๋๊ฒ ํ๋ return, throw ๋ฌธ์ด try ๋ธ๋ก ๋ด๋ถ์ ์์ด๋ finally ๋ธ๋ก์ ๋ฐ๋์ ์คํ๋๋ค. ๋ํ, ์์ธ๊ฐ ๋ฐ์ํ๋ ๋ฐ์ํ์ง ์๋ ๋ฌด์กฐ๊ฑด finally ๋ธ๋ก์ ์คํ๋๋ค. ์ด ์ ์ ๊ธฐ์ตํ์.
finally ์์์ ์์ธ๊ฐ ๋ ๋ฐ์ํ๋ค๋ฉด?
๊ทธ๋ฌ๋ฉด, finally ๋ธ๋ก ์์์ ๋ฐ์์ฃผ๊ฑฐ๋ ์ฒ๋ฆฌํด์ฃผ๋ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก ํด๋น ์์ธ๋ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๊ฐ ๋๋ค. ์ต๋ํ ์์ธ๊ฐ ์ผ์ด๋์ง ์๋๋ก ํ๋, ์ฅ๋ดํ ์ ์๋ค๋ฉด finally ์์์ ๋ค์ ํ๋ฒ try~catch๋ก ๋ฌถ์ด์ฃผ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด ๋๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค
System.Exception ํด๋์ค๋ฅผ ์์๋ฐ์์ ์ฌ์ฉ์๊ฐ ์ํ๋ ์๋ก์ด ์์ธ ํด๋์ค๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
class MyException : Exception
{
public int ErroNo {get; set;}
}
๊ทธ๋ฆฌ๊ณ throw ๋ฌธ์ ํตํด ์์ธ๋ฅผ ๋์ ธ์ฃผ๋ฉด ๋๋ค.
try
{
...
throw new MyException();
}
catch(MyException e)
{
...
}
๋ง์ฝ ์์ธ๋ฅผ ํํฐ๋งํด์ ๋ฐ๊ณ ์ถ๋ค๋ฉด, when์ ํตํ ์ถ๊ฐ ์กฐ๊ฑด์ ์ฃผ๋ฉด ๋๋ค.
try
{
...
}
catch(MyException e) when (e.ErroNo < 0)
{
...
}