에러와 예외

킴스코딩클럽·2022년 10월 26일
1

CS기초 시리즈

목록 보기
46/71

에러(error) : 프로그래머의 실수

  • compile time error : 컴파일 시간에 발생 에러
    • 문법 타입이 올바른지?
    • 매우 고치기 쉬움
  • link time error : 링크에 발생하는 에러
    • 식별자 누락
    • 생소하지만 고치기 쉬움
  • runtime error : 앱이 실행되는 동안 발생하는 오류
    • 컴퓨터가 감지한 오류
    • 라이브러리가 감지한 오류
    • 유저가 감지한 오류

에러의 원인

  • 클라이언트 / 기획자 오류
  • 불완전한 프로그램
  • unexpected(예상하지 못하는 상황)
    • argument
    • input (인터페이스)
    • state (자료구조)
  • logic error(논리 오류)
    해결하기 어려움 >> 동료
    Pair Programming
double MyFunction(int a, int b)
{
	return a / b; //논리오류 정수만 결과로 나옴
    return (double)a/b; //논리오류 제거
}

int main()
{
	int a=10;
	int b=9;
	std::cout << MyFunction(a, b);
}


double MyFunction(int a, int b)
{
	return (double)a / b;
}

int main()
{
	int 3;
	int 0;
	std::cin >> a >> b;
	std::cout << MyFunction(a, b);
}
//결과 : inf (무한대) 0으로 나누기 때문
//b는 0이 되면 안되도록 처리가 필요
//1번:함수를 부르는(caller)에서 처리

double MyFunction(int a, int b)
{
	return (double)a / b;
}

int main()
{
	int 3;
	int 0;
	std::cin >> a >> b;
    if(b==0)
    {
    	std::cout<<"0으로 나누기 불가"
        std::cerr<<"캐릭터를 에러 스트림으로 내보냄"
    }
    else
    {
	std::cout << MyFunction(a, b);
	}
}

//2번:함수에서 처리(callee) : 이 방법이 깔끔함
double MyFunction(int a, int b)
{
	if(b==0)
    {
    	std::cerr<<"divide by zero";
        return infinity;
    }
    
   return (double)a / b;
	
}

int main()
{
	int 3;
	int 0;
	std::cin >> a >> b;
	std::cout << MyFunction(a, b);
}
  • 함수라면 callee에서 에러를 처리하는 것이 편함
    함수를 활용하는 이유가 기능을 분리해서 간단하게 만들기 위해서 이기 때문

예외 (exception)

사용자가 기대하는 작업 이외의 것을 시도할 때
에러를 처리하는 하나의 방법이기도함

  • thrwo - try ~catch 구문

error 발생을 감지하면 exception을 만들고 exception을 처리함
exception - throw 예외를 던지고
try 시도해본다음
catch 예외가 잡히면 처리

  • 에러와 예외 처리를 분리하기 위한 방법
double MyFunction(int a, int b)
{
	if (b==0) //error detect
	{
		throw std::logic_error("divide by zero");
        //예외를 만듬(exception)
	}
	return (double)a / b;
}

int main()
{
	int a;
	int b;
	std::cin >> a >> b;
    try
    {
		std::cout << MyFunction(a, b);
	}
    catch(std::logic_error)
    {
    	std::cout<<"divide by zero";
    }
    //exception handling
    //아이디 입력
    //내용
    //인터넷으로 전송
}
	catch(...) //말줄임표 : 어떤 예외든 다 때려박음
    {
 		std::cerr<<"unexpected exception";
    }
 	//프로그램의 흐름이 강제적으로 변경됨 예외사항이라면 바로 catch부분으로 옴

CASSERT 기능 (VISUAL STUDIO)
--

#include <iostream>
#include <cassert> //ASSERT라는 기능은 디버그에서만 작동함

int main()
{
	int* p = new int;

	assert(p!=nullptr);
	assert(p);
	//괄호안을 참으로 단언하는 코드 
	//괄호안이 거짓으로 되면 error!!
	//메모리가 정상적으로 할당되었다면이라는 뜻

	int money = 100;
	//잔액 확인
	//구매 /차감
	if (money<0)
	{
		//안됨
	} 
	assert(money >= 0);
}
profile
공부 기록용

0개의 댓글