C#/이것이 C#이닀

60. μ˜ˆμ™Έ μ²˜λ¦¬ν•˜κΈ°(1)

Rainbow🌈Coder 2022. 4. 9. 20:50
728x90

https://youtu.be/Os_o-7eGu7Y

 

챕터 12 μ˜ˆμ™Έ μ²˜λ¦¬ν•˜κΈ°

 

이 μž₯의 핡심 κ°œλ… ꡬ쑰적 μ˜ˆμ™Έ μ²˜λ¦¬κ°€ 무엇인지 μ΄ν•΄ν•œλ‹€

try~catch~finally 문을 μ΄μš©ν•œ μ˜ˆμ™Έ 처리 방법을 μ΅νžŒλ‹€

System.Exception 클래슀λ₯Ό μ΄ν•΄ν•œλ‹€

throw 문을 μ΄μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 방법을 μ΅νžŒλ‹€

μ‚¬μš©μž μ •μ˜ 클래슀λ₯Ό μ •μ˜ν•˜κ³  μ‚¬μš©ν•˜λŠ” 방법을 μ΅νžŒλ‹€

 

 

μ˜ˆμ™Έμ— λŒ€ν•˜μ—¬

μ •μ˜: ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μƒκ°ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ λ²—μ–΄λ‚˜λŠ” 사건, 이것을 μ˜ˆμ™ΈλΌκ³  λΆ€λ₯Έλ‹€.

예1) μˆ«μžκ°€ μž…λ ₯λ˜μ–΄μ•Ό ν•˜λŠ” λ³€μˆ˜μ— λ¬Έμžμ—΄ μž…λ ₯ μ‹œλ„

예2) νŒŒμΌμ„ μ €μž₯μ‹œ ν•˜λ“œλ””μŠ€ν¬ μš©λŸ‰ μ†Œμ§„

 

μ˜ˆμ™Έμ²˜λ¦¬ : ν”„λ‘œκ·Έλž¨μ˜ 였λ₯˜λ‚˜ λ‹€μš΄μœΌλ‘œ 이어지지 μ•Šλ„λ‘ μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” 것

 

using System;
using System.Collections;
using static System.Console;

namespace TryCatch
{

    class MainApp
    {
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3 };

                for(int i=0; i<5; i++)
                {
                    WriteLine(arr[i]);
                }

            WriteLine("μ’…λ£Œ");
        }
    }
}

μ•„λ¬΄λŸ° μ˜ˆμ™Έ μ²˜λ¦¬λ„ ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨μ΄ λ‹€μš΄λ˜μ—ˆλ‹€.

λ§ˆμ§€λ§‰ λ©”μ„Έμ§€λŠ” CLR이 좜λ ₯ν•œ 것이닀. 잘λͺ»λœ 인덱슀λ₯Ό 톡해 λ°°μ—΄μ˜ μš”μ†Œμ— μ ‘κ·Όν•˜λ € λ“€λ©΄ λ°°μ—΄ 객체가 이 λ¬Έμ œμ— λŒ€ν•œ 상세 정보λ₯Ό IndexOutOfRangeException의 객체에 담은 ν›„ Main()λ©”μ†Œλ“œμ— λ˜μ§€λŠ”λ°, 이 예제의 Main() λ©”μ†Œλ“œλŠ” 이 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  방도가 μ—†κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ CLR에 λ˜μ§„λ‹€. CLRκΉŒμ§€ μ „λ‹¬λœ μ˜ˆμ™ΈλŠ” 'μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έ'κ°€ 되고 CLR은 이것을 λ°›μœΌλ©΄ μ˜ˆμ™Έ 객체에 λ‹΄κΈ΄ λ‚΄μš©μ„ μ‚¬μš©μžμ—κ²Œ 좜λ ₯ν•œ ν›„ ν”„λ‘œκ·Έλž¨μ„ κ°•μ œλ‘œ μ’…λ£Œν•œλ‹€. κ·Έλž˜μ„œ 문제λ₯Ό μΌμœΌν‚€λŠ” 15ν–‰ 뒀에 μžˆλŠ” μ½”λ“œλ“€λ„ μ‹€ν–‰λ˜μ§€ μ•Šμ€ 것이닀.

 

κΉŒμ§€ 좜λ ₯되고 15λΌμΈμ—μ„œ iκ°€ 'λ°°μ—΄μ˜ 크기 -1'을 λ„˜μ–΄μ„°κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έλ₯Ό μΌμœΌν‚€κ³  μ’…λ£Œλœλ‹€. μ΄ν›„μ˜ μ½”λ“œλ“€μ΄ μ‹€ν–‰λ˜μ§€ μ•Šμ•˜λ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ„œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

μ˜ˆμ™Έ λ°œμƒ: 'System.IndexOutOfRangeException'(Hello.exe)
μ²˜λ¦¬λ˜μ§€ μ•Šμ€ 'System.IndexOutOfRangeException' ν˜•μ‹μ˜ μ˜ˆμ™Έκ°€ Hello.exeμ—μ„œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
μΈλ±μŠ€κ°€ λ°°μ—΄ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€.

 

이 예제 ν”„λ‘œκ·Έλž¨μ²˜λŸΌ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•΄ μ£½λŠ” ν”„λ‘œκ·Έλž¨μ€ 아무리 κΈ°λŠ₯이 λ§Žμ•„λ„ μ‹ λ’°ν•  수 μ—†λ‹€. ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” μžμ‹ μ΄ μž‘μ„±ν•œ μ½”λ“œ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ μ²˜λ¦¬λ˜λ„λ‘ 쑰치λ₯Ό μ·¨ν•΄μ•Ό ν•œλ‹€.

 

 

μ•žμ˜ 예제 ν”„λ‘œκ·Έλž¨μ—μ„œ 배열이 IndexOutOfRangeException μ˜ˆμ™Έλ₯Ό λ˜μ‘ŒλŠ”λ° Main()λ©”μ†Œλ“œκ°€ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 μ˜ˆμ™Έλ₯Ό Main()λ©”μ†Œλ“œκ°€ 'λ°›μœΌλ©΄'λœλ‹€. C#μ—μ„œλŠ” μ˜ˆμ™Έλ₯Ό 받을 λ•Œ try~catch문을 μ΄μš©ν•œλ‹€.

 

try~catch둜 μ˜ˆμ™Έλ°›κΈ°

 

try~catchλŠ” ꡬ쑰적으둜 μ˜ˆμ™Έ 처리λ₯Ό ν•  수 있게 ν•΄μ£ΌλŠ” 문법

try λΈ”λ‘μ—λŠ” μ‹€ν–‰ν•˜κ³ μž ν•˜λŠ” μ½”λ“œ, catch λΈ”λ‘μ—λŠ” 에외 λ°œμƒμ‹œ μ²˜λ¦¬ν•  μ½”λ“œ μž‘μ„±

 

try
{
	//μ‹€ν–‰ν•˜κ³ μž ν•˜λŠ” μ½”λ“œ
}
catch(μ˜ˆμ™Έ 객체_1)
{
	//μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œμ˜ 처리
}
catch(μ˜ˆμ™Έ 객체_2)
{
	//μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œμ˜ 처리
}

try 절의 μ½”λ“œ λΈ”λ‘μ—λŠ” μ˜ˆμ™Έκ°€ μΌμ–΄λ‚˜μ§€ μ•Šμ„ κ²½μš°μ— μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μ½”λ“œλ“€μ΄ λ“€μ–΄κ°€κ³ ,

catch μ ˆμ—λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œμ˜ 처리 μ½”λ“œκ°€ λ“€μ–΄κ°„λ‹€.

 

try: μ‹œλ„ν•˜λ‹€

catch : μž‘λ‹€ λ˜λŠ” λ°›λ‹€ λΌλŠ” 뜻

 

try μ ˆμ—μ„œ μ›λž˜ μ‹€ν–‰ν•˜κ³ μž ν–ˆλ˜ μ½”λ“œλ₯Ό μ­‰ μ²˜λ¦¬ν•΄λ‚˜κ°€λ‹€κ°€ μ˜ˆμ™Έκ°€ λ˜μ Έμ§€λ©΄ catch 블둝이 λ°›μ•„λ‚Έλ‹€.

μ΄λ•Œ catchμ ˆμ€ try λΈ”λ‘μ—μ„œ 던질 μ˜ˆμ™Έ 객체와 ν˜•μ‹μ΄ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ˜μ Έμ§„ μ˜ˆμ™ΈλŠ” 아무도 λ°›μ§€ λͺ»ν•΄ 'μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έ'둜 λ‚¨κ²Œ λœλ‹€. λ§Œμ•½ try λΈ”λ‘μ—μ„œ μ‹€ν–‰ν•˜λŠ” μ½”λ“œμ—μ„œ μ—¬λŸ¬ μ’…λ₯˜μ˜ μ˜ˆμ™Έλ₯Ό 던질 κ°€λŠ₯성이 μžˆλ‹€λ©΄, 이λ₯Ό λ°›μ•„λ‚Ό catch 블둝도 μ—¬λŸ¬κ°œλ₯Ό λ‘˜ 수 μžˆλ‹€.

 

 

μ•žμ˜ μ˜ˆμ œμ—

try~catch 문을 μ‚¬μš©ν•΄λ³΄λ„λ‘ ν•œλ‹€.

μ˜ˆμ™Έλ₯Ό μ•ˆμ „ν•˜κ²Œ λ°›μ•„ μ²˜λ¦¬ν•˜κ³  ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œμ‹œν‚€λ„λ‘ μˆ˜μ •ν•œλ‹€.

try~catch 문을 μ΄μš©ν•΄μ„œ 잘λͺ»λœ 인덱슀λ₯Ό 톡해 λ°°μ—΄μ˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ μΌμ–΄λ‚˜λŠ” IndexOutOfRangeException μ˜ˆμ™Έλ₯Ό μ•ˆμ „ν•˜κ²Œ λ°›μ•„ μ²˜λ¦¬ν•œλ‹€.

 

using System;
using System.Collections;
using static System.Console;

namespace TryCatch
{

    class MainApp
    {
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3 };
            try
            {
                for(int i=0; i<5; i++)
                {
                    WriteLine(arr[i]);
                }
            }
            catch (IndexOutOfRangeException e)
            {
                WriteLine($"μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. : {e.Message}");
            }
            WriteLine("μ’…λ£Œ");
        }
    }
}

iκ°€ 3이 되면 IndexOutOfRangeException 객체가 λ˜μ Έμ§€κ³  catch 블둝이 이λ₯Ό λ°›μ•„λ‚Έλ‹€.

특히 catch 문은 μœ„μ™€ 같이 볡수개둜 μ“Έ 수 μžˆλ‹€. λ‹€μ–‘ν•œ μ˜ˆμ™Έ 상황에 λŒ€μ‘ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

728x90