2011. 9. 6. 19:23

디버깅 및 오류 처리

* 오류 종류            설명

구문오류              컴파일 과정에서 일어나기 때문에 컴파일 오류라고도 합니다. 개발자가 실수로 잘못 입력하거나 틀린 구문을
                          사용했을때 발생합니다.

실행오류              런타임 오류(Runtime Error)라고도 하는데, 코드 구문 상으로는 문제가 없지만, 프로그램 로직이 잘못되었거
                          나, 적절한 값이 아닌 경우 계산이 잘못되어 발생합니다.



try/catch 문을 사용해서 오류 처리하는 방법입니다.



public partial class Calc : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
protected void Button1_Click(object sender, EventArgs e)
{
    // 버튼을 클릭하면 선택한 연산자에 따라 값을 계산해준다.
    int n1 = Convert.ToInt32(TextBox1.Text);
    int n2 = Convert.ToInt32(TextBox2.Text);

    int res = 0;

    try
    {
        switch (Operator.SelectedItem.Value)
        {
            case "+": res = n1 + n2; break;
            case "-": res = n1 - n2; break;
            case "*": res = n1 * n2; break;
            case "/": res = n1 / n2; break;
        }
        Label1.Text = res.ToString();
    }
    catch
    {
        Label1.Text = "계산 과정에서 오류가 발생했습니다.";
    }

}
    protected void Operator_SelectedIndexChanged(object sender, EventArgs e)
    {
        // 버튼을 클릭하면 선택한 연산자에 따라 값을 계산해준다.
        int n1 = Convert.ToInt32(TextBox1.Text);
        int n2 = Convert.ToInt32(TextBox2.Text);
        int res = 0;

        try
        {
            switch (Operator.SelectedItem.Value)
            {
                case "+": res = n1 + n2; break;
                case "-": res = n1 - n2; break;
                case "*": res = n1 * n2; break;
                case "/": res = n1 / n2; break;
            }
            Label1.Text = res.ToString();
        }
        catch
        {
            Label1.Text = "계산 과정에서 오류가 발생했습니다.";
        }
    }
}


* 예외처리(Exception)
프로그램을 실행하는 도중 발생한 오퓨를 처리하는 방법입니다. 기존의 프로그래밍을 언어가 가지고 있던 오류 처리 방식을 보안해서 체계적으로 오류를 해결하는 방식입니다. 특히 클래스를 위주로 하는 객체 프로그래밍에서 유용하게 쓰일수 있습니다.


예외처리                                설명
Exception                                      실행 타임에 발생하는 모든 오류를 점검 합니다. 다른 모든 Execption 객체의 베이스
                                                    클래스 입니다.

IndexOutOfRangeException              배열 인덱스 값을 잘못 쓸 때 발생하는 예외 처리 입니다. 배열의 인덱스 범위를 벗어나는
                                                    경우에 발생합니다. 예) arr[arr.Length+1]
NullReferenceException                   실행 타임에 빈 객체를 참조 했을때 발생하는 예외 처리입니다.
                                                    예) object 0=null; o.ToStrin();
AccessException                           클래스 멤버를 사용 못하는 경우에 발생합니다.
ArithmeticException                        계산을 하다가 오버플로나 언더플로가 나는 경우에 발생합니다.
ArrTypeMismatchException             배열에 적절하지 않은 데이터형 개체를 넣으려고 하는 경우에 발생합니다.
DivideByZeroException                    0 나누기 오류가 발생한 경우입니다.
InvalidCastException                       객체를 억지로 형 변환해서 사용하는 경우에 발생합니다.




throw 문
입력 값이나 변수 값이 잘못되었다고 판단하고 임의로 예외 처리한 예입니다. 변수 값이 0인 경우, 잘못된 값이라고 판단하고 오류처리 합니다. throw 문을 불러주며, 오류 메시지와 함께 Excepton 객체를 보내줍니다.

//throw 문을 이용한 예외 처리발생.
try
{
int val = 0
            if (val == 0)
            throw(new Exception("0값은 허용되지 않습니다."));  
}
catch(Exception e)
{
           Console.WriteLine("예외 처리 : " + e.Message);
}

C# 이 제공하고 있는 Exception 객체는 앞에 보인 예처럼 일반적인 오류 들을 다루는 예외 처리 객체 입니다. 코드에서 특정 오류를 처리해주려면, throw 문을 이용해서 예외 처리를 발생시키고 catch 문에게 넘겨주는 방식이 필요합니다.




finally문
finally문은 오류를 처리하는 것이 아니라, 실행을 마무리하기 위한 용도입니다. finally 문에 있는 코드는 정상적으로 싱행된 경우와 오류가 발생한 경우 모두 실행됩니다.
예를 들어 try 불록에서 파일을 사용한 경우, 정상적으로 파일을 읽은 경우와 파일을 읽다가 오류가 발생한 경우 모두 열린 파일을 닫아주어야 합니다. finally 불록에 파일을 닫는 코드를 넣어줍니다.

try
{
                Console.WriteLine(  "정상적인 실행");
}
finally
{
                //오류 발생 여부에 상관없이 항상 실행됩니다.
                Console.WriteLine("마무리코드실행");
}




디버깅


디버그키                   설명
F10                          프로시저 단위로 실행합니다.
F11                          한 단계식 실행하며, 실행할 코드가 메서드이면 메서드 안으로 들어갑니다.
Ctrl+F10                    현재 커서가 위치한 곳까지 실행
F9                           현재커서 위치에서 중단점(Brakpoint)추가 또는 취소