티스토리 뷰
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication141119 { class Program { static void Main(string[] args) { int n = 0; string t = null; //////////////////////////////////////////////////////// try { n = 10 / n; //예외 구문을 사용하지 않고 위 라인의 코드를 사용하면 DevideByZeroException을 경험할 것이다. } catch { } ///////////////////////////////////////////////////////// try { Console.WriteLine(t.ToLower()); } catch(System.NullReferenceException) { //위 처럼 직접 catch키워드의 인자로 예외객체를 명시할 수 도 있다. Console.WriteLine("NULL예외"); } ///////////////////////////////////////////////////////////////// try { n = 10 / n; } catch(DivideByZeroException e) { Console.WriteLine(e.Message); //catch의 인자로 예외 객체의 변수를 만들어 예외에 대한 정보를 출력할 수도 있다, } finally { //finally구문을 사용하면 예외가 발생하든지 안하든지 try catch 수행 후에 수행할 작업을 명시하면 //작업을 수행한다. Console.WriteLine("이 구문 끝남 finally 수행함"); } ///////////////////////////////////////////////////////// try { n = 10 / n; } catch (System.NullReferenceException) { //catch구문을 인자로 구분지을 경우 해당하는 예외 인자가 없다면 예외가 발생한다. } catch (System.OutOfMemoryException) { } } } }
올바른 예외처리
프로그램의 오동작을 처리하기 위해 예외를 발생시켜야 하나 아니면 동작하면
안된다는 결과를 돌려줘야할까
아래의 코드를 보자
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication141119 { class Program { static void Main(string[] args) { try { ThrowPay(0); ThrowPay(0); Buy(); } catch (Exception e) { Console.WriteLine(e.Message); } //ThrowPay call if(BoolPay(0) == false){ return; }
if (BoolPay(0) == false) { return; }
Buy(); //BoolPay call } static bool BoolPay(int cost) { if (cost == 0) { return false; } return true; } static bool ThrowPay(int cost) { if (cost == 0) { throw new Exception("입금안됨"); } return true; } static void Buy() { Console.WriteLine("결제되고 물건삼"); } } }
예를 들어 쇼핑몰에서 물건을 사는데 돈이 입금이 안되면 입금이 안되야하는 로직의 프로그램을
짠다고 했을 때 BoolPay의 경우는 false라는 bool형태의 값으로 리턴하고 있고, ThrowPay는 예외를
강제로 발생하고 있다.
물건을 여러가지 사고 pay를 여러번 해야 할 때 BoolPay는 if문으로 계속 유효검사를 해야한다.
하지만 ThrowPay의 경우는 try/catch문으로 묶어주고 안에 ThrowPay를 몇번 지불하던지
call해주면 된다.
당연히 ThrowPay를 사용하는 코드가 더 간결하다.
간결하다고 하는 이유도 있지만 ThrowPay의 경우는 입금이 안될때 예외를 발생하는 강제성이
존재 하지만 BoolPay의 경우는 강제성이 없다.
강제성이 없다는 것은 단독으로 BoolPay(0) 같은 위험한 코드를 사용할 수도 있다는 것이다.
이렇게 단독으로 사용하게 되면 조건문이 없기 때문에 그다음에 물건을 입금하고 산다는
Buy를 수행하는 코드가 오게 된다면 막을 도리가 없다.
물론 그렇게 코딩을 안하면 되지만 개발자도 사람이기 때문에 실수로
이런방식의 코딩을 하게될 수도 있다.
'C#' 카테고리의 다른 글
깊은 복사, 얕은 복사, ref, out 예약어 (0) | 2014.12.28 |
---|---|
[BaseClassLibrary]직렬화/역직렬화 (0) | 2014.12.05 |
CLR(C#가상머신) 초기화시 값을 전달할 경우 app.config 활용 (0) | 2014.11.18 |
상수를 나타내는 const와 읽기 전용의 readonly키워드 (0) | 2014.08.27 |
c# 에서의 정보은닉(information hiding) (0) | 2014.08.27 |