🧠
Hi, Daehuyn Lee
  • Fork-my-brain
  • Network
    • 7. "데이터가 전달되는 원리" OSI 7계층 모델과 TCP:IP 모델
    • [Netwhat] 연습문제 정리
    • 11. IP 라우팅(routing) 동작 과정
    • 3. IP address 란?
    • 2. 컴퓨터 구조를 통해 이해하는 파일(File)과 소켓(Socket)
    • 10 "더 편리한 인터넷을 위해" DHCP && DNS 프로토콜
    • 9. 데이터? 세그먼트? 패킷? 헷갈릴 땐 PDU를 알아보자
    • 8. TCP 와 UDP 차이를 자세히 알아보자
    • 5. 서브넷팅(subnetting)으로 네크워크를 효율적으로 관리하자
    • 4. 넷마스크(Netmask)와 서브넷마스크(Subnetmask)
    • 1. 비유로 이해하는 컴퓨터 구조
    • 6. 공인(Public) && 사설(Private) IP의 차이점
  • Django
    • [Django 1] 가상환경에 Django 설치하기
    • [Django 3] Hello World 웹사이트 만들기
    • [Django 9] static 으로 css 로드하기
    • [Django 10] 한 템플릿에서 복수의 css 파일 적용하기
    • [Django 11] URL app별로 관리하기
    • [Django 8] 템플릿 상속
    • [Django 4] MTV 패턴
    • [Django 6] 블로그 model 만들기
    • [Django 2] Django는 어떻게 작동할까
    • [Django 7] '새 글 작성' 기능 만들기
    • [Django 5] 템플릿 언어
  • Projects
    • 예발자닷컴
      • 4. 프론트엔드의 역할은 어디까지 - 더미데이터 만들기
      • 7. [React 리팩토링] CSS Inline Styling에 Props 사용하기
      • 6. [React 리팩토링] JSX에서 조건문 사용해 렌더링하기
      • 3. 예발자닷컴 프론트서버 업데이트 하기
      • 8. [React 리팩토링] 예발자 프로젝트에 Redux 적용하기
      • 5. [React 리팩토링] JSX로 HTML 렌더링하기
      • 1. 👨‍👨‍👦‍👦 Github로 협업 프로젝트 관리하기
      • 2. React Component를 활용한 웹페이지 디자인 연습
  • Git
    • [Git] Interactive Rebase 실습
    • 오픈소스 개발 참여에 필요한 Git 명령어 정리
    • 개발자가 오픈소스를 읽는 방법
    • 오픈소스 프로젝트 시작하기
    • SSH agent ; Passphrase 입력 없이 Push하기
    • SSH로 원격저장소 접속하기
    • [Github] 개인 저장소를 팀 저장소로 변경하기
    • GitHub Dependabot
    • Git add, commit, push 취소하기
    • 깃헙 잔디 관리 팁
    • 원격저장소 여러개 연결하기
    • Typora(마크다운 에디터) 사용법
  • C
    • C Piscine
      • 메모리 구조를 알아보자
      • Makefile 만들기
      • GCC로 정적 라이브러리 파일 만들기
      • 외부 라이브러리 GCC로 컴파일 하기
      • 정적(Static) 변수
      • 저수준 파일 입출력
      • Makefile 자주 사용하는 문법 정리
      • segmentation fault 해결하기
      • C의 구조체 개념
      • 연결 리스트(linked list)에서 이중 포인터 사용하기
      • 로컬에 Norminette 설치하기
    • GetNextLine
      • [GetNextLine] 과제소개-Reading a line on a fd is way too tedious
      • [GetNextLine] 삽질의 기록
      • [GetNextLine] 리팩토링-프로그램의 목적을 고려한 코드
    • ft_printf
      • 1. 과제소개
      • 2. 가변인자 (Variadic Arguments)
      • 3. 형식태그와 서식지정자 printf 함수의 옵션 알아보기
    • Libft
      • [Libft] Bonus
      • [Libft] Test Program
      • [Libft] 나만의 C 라이브러리 만들기
      • [Libft] Part 2
      • [Libft] Part 1
  • UNIX shell
    • [minishell] 4. 종료상태와 에러메세지 처리
    • [minishell] 1. 과제소개 및 선행지식
    • [minishell] 2. 프로그램 구조 및 개발 기록들
    • [minishell] 5. 파이프(Pipe) 처리
    • [minishell] 3. 시그널(Signal) 처리하기
    • [minishell] 6. 리다이렉션(Redirection) 처리
  • Web
    • Next.js
      • [Next.js] CSS모듈과 복수의 class 사용하기
    • Node.js
      • [Node.js] 웹페이지에 파일 띄우기
      • [Node.js] URL에서 쿼리스트링 추출하기
      • [Node.js] '새 글 작성' 페이지 만들기
    • React
      • [React] 2. 컴포넌트(Component) 생성 및 파일별로 분리하기
      • [React] 1. 파일 구조 이해하기
      • [React] 4. 컴포넌트의 State 란
      • [React] 3. 컴포넌트의 Props 란
    • Javascript
      • Click, Enter 두 개의 이벤트 동시에 등록하기
      • Click eventListener 등록하기
      • JavaScript & C 문법 비교
      • JavaScript 객체 지향의 특징
    • CSS
      • [CSS] box-model, display, position
  • Docker
    • ft_server
      • 2. 도커 설치부터 워드프레스 구축까지
      • 1. 선행지식-Docker? Debian Buster? Nginx? ...
      • 3. Dockerfile 만들기
  • Kubernetes
    • 🌌[쿠버네티스 아키텍처] 3. API 호출
    • 🌌[쿠버네티스 아키텍처] 1. 구성 및 설계
    • 🌌[쿠버네티스 아키텍처] 2. 오브젝트 (Objects)
  • Operating System
    • Philosophers
      • [Philosophers] 예시예제로 보는 뮤텍스와 세마포어의 차이
      • [Philosophers] 식사하는 철학자 문제 소개
  • CPP
    • [CPP-08] STL containers, iterators, algorithms
    • [CPP-06] CPP 형변환 연산자
    • [CPP-04 ex02] 인터페이스(Interface) 클래스
    • [CPP-04 ex00] 다형성(Polymorphism) 및 가상함수
    • [CPP-02] Canonical 클래스 복사 생성자와 대입 연산자 오버로딩
    • [CPP-07] Templates
    • [CPP-01] this 포인터와 문자열 스트림(stringstream)
    • [CPP-01] 클래스의 정적할당과 동적할당 new, delete
    • [CPP-01] 파일 입출력 및 문자열 치환하기
    • [CPP-01] 참조자(reference)와 포인터는 다르다
    • [CPP-02] 정수부동소수값 - 고정소수값 변환
    • [CPP-04 ex01] 추상 클래스의 필요성 순수 가상함수
    • [CPP-00] Megaphone! CPP 표준입출력
    • [CPP-03] (ClapTrap이 뭐지) 다중 상속과 가상 상속
    • [CPP-05] 예외 처리 (exception handling)
    • [CPP-00] 객체지향의 관점으로 클래스 이해하기
    • [CPP-01] 랜덤값 얻기
  • IBM Cloud
    • [IBM Cloud] 1. 클라우드 컴퓨팅 개요
    • [IBM Cloud] 5. 클라우드 컴퓨팅의 구성 요소
    • [IBM Cloud] 3. 클라우드 서비스 모델 및 배포 모델
    • [IBM Cloud] 2. 클라우드를 활용하는 새 기술들
    • [IBM Cloud] 4. 떠오르는 클라우드 트렌드
    • [IBM Cloud] 6. 클라우드 스토리지 유형 및 CDN
  • Assembly
    • [libasm] 어셈블리 프로그램 구조와 x64 레지스터 이해하기
    • [libasm] strlen 함수를 어셈블리어로 짠다면
    • [libasm] 어셈블리 명령어(opcode) 정리
Powered by GitBook
On this page
  • 1. try ~ catch 문
  • 2. throw 문
  • 3. std::exeception::what()
  • 4. exeception 예제
  • 1) 헤더파일
  • 2) 소스파일
  • 3) main문

Was this helpful?

  1. CPP

[CPP-05] 예외 처리 (exception handling)

C에서는 조건문(if)를 통해서 예외를 처리했었지만, CPP에서는 보다 더 직관적인 문법을 제공한다.

목표 : 공무원 클래스의 등급이 정해진 범위를 벗어났을 때 예외를 발생시킴으로써 CPP의 예외처리 방법에 대해 학습한다.

[Ex00: Mommy, when I grow up, I want to be a bureaucrat! 과제]

  1. Bureaucrat (공무원) 클래스 작성

    • 멤버변수: const name

    • 멤버변수: grade (1~150 사이의 int 범위): 유효하지 않은 grade면 예외처리를 해야한다.

      • Bureaucrat::GradeTooHighException 클래스

      • Bureaucrat::GradeTooLowException. 클래스

    • getName()

    • getGrade()

    • increaseGrade(void) 와 decreaseGrade(void);

      • 1이 높은 등급이고 150이 가장 낮은 등급이다.

  2. 예외처리블록은 다음과 같이 catchable 해야한다.

   try
   {
           /* do some stuff with bureaucrats */
   }
   catch (std::exception & e) 
   {
           /* handle exception */
   }
  1. << 연산자 오버로드

   <name>, bureaucrat grade <grade>

1. try ~ catch 문

이번 과제에서는 CPP에서 예외 처리(exception handling)를 어떤 방법으로 하는지 학습할 수 있다. 예외를 처리한다는 것은, 예외가 발생할 만한 상황과 예외가 발생했을 때의 동작을 프로그램 구현 단계에서 미리 예상하고 있겠다는 의미다.

C에서는 조건문(if)를 통해서 예외를 처리했었지만, CPP에서는 보다 더 직관적인 문법을 제공한다. try와 catch 구문인데, 예외가 발생할 만한 상황 을 try 코드블록에, 예외가 발생했을 때의 동작 을 catch 코드블록에 정의해두면 된다.

  • try : 예외가 발생할 가능성이 있는 코드 블록. 예외가 발생하지 않는다면 try~catch문이 없는 것과 동일하게 동작하며, 예외가 발생하면 그 즉시 catch문으로 점프한다.

  • catch : 내부에 정의된 예외처리를 실시하는 코드 블록.

조건문은 프로그램의 논리를 위한 코드로만 사용하고, 예외를 처리할 때는 '의도치 않은 상황'과 그때의 동작에만 집중해 코드를 짤 수 있도록 프로그램 차원에서 문법을 제공하는 것이다.

그러면 개발자는 '의도치 않은 상황'이 언제 발생할 수 있을지만 생각해 보면 된다. 이번 과제에서는 공무원 클래스의 등급이 1~150 범위를 벗어날 때일 것이다.

  1. 공무원 객체를 생성하면서 인자로 등급을 받을 때.

  2. 생성된 공무원의 등급을 올리거나 내릴 때.

위의 두 상황을 항상 try 코드블럭에 넣어두면, 예외가 발생했을 때 catch절로 넘어가 상황을 종료하고 정상적인 동작을 취할 수 있도록 프로그램을 잘 구현할 수 있게 된다.

2. throw 문

try 에서 예외가 발생했을 때 어떻게 catch 절에 예외 상황을 전달할 수 있을까? 이때 사용하는 것이 throw문이다. throw 는 try 문에서 예외를 탐색하면 throw의 변수를 catch로 전달한다.

try {
    if (예외 상황) {
        throw 변수명
    };
};

즉 catch 는, throw에서 던진 변수를 인자로 받아 catch 내부에 정의된 예외처리를 실시하는 코드 블록이다. 이때 각 catch 절은 인자로 받은 변수의 타입에 따라 예외 상황을 다르게 처리할 수 있다.

하지만 CPP 표준에서는 throw 문의 피연산자로 std::exception에서 파생되는 예외 타입을 사용하도록 권장하고 있다. 이 클래스에는 cpp에서 제공하는 많은 예외 타입이 이미 정의되어 있기 때문이다.

3. std::exeception::what()

예외를 담당하는 기본 CPP제공 클래스이다. 모든 예외 처리 클래스는 이 클래스를 상속받아서 작성된다. 따라서 다형성의 원리에 의해 어떤 에러를 던지더라도, 추상클래스인 exception 클래스 로 받을 수 있다.

exception 클래스는 하나의 문자열 포인터를 반환하는 what()이라는 가상 멤버 함수를 제공한다. 이 멤버 함수는 가상 함수이므로, exception 클래스로부터 파생된 클래스 내에서 재정의 해 원하는 문자열을 출력할 수 있도록 할 수 있다.

virtual const char* what() const throw();  //(until C++11)
virtual const char* what() const noexcept; //(since C++11)
  • 반환값: Pointer to a null-terminated string with explanatory information.

  • 42 과제는 C++98을 표준으로 하기 때문에 throw()를 사용한다.

4. exeception 예제

1) 헤더파일

#include <exception>

class Bureaucrat
{
private:
    const std::string    name_;
    int                                grade_;

public:
  Bureaucrat(const std::string name, int grade);
    ~Bureaucrat();

    class GradeTooHighException : public std::exception
    {
    public:
        virtual const char* what() const throw();
    };
};
  1. std::exeception의 파생클래스인 GradeTooHighException을 선언했다.

  2. what() 가상함수도 함께 선언한다.

2) 소스파일

#include "Bureaucrat.hpp"

Bureaucrat::Bureaucrat(const std::string name, int grade) : name_(name), grade_(grade)
{
    if (grade_ < 1)
        throw Bureaucrat::GradeTooHighException();
}

const char* Bureaucrat::GradeTooHighException::what() const throw()
{
    return ("BureaucratException: Grade too High");
}
  1. Bureaucrat 객체 생성시 인자로 들어온 grade_가 1보다 작을 때, exeception 클래스를 throw한다.

  2. what()을 오버라이딩한다. 원하는 문자열을 반환하면 된다.

3) main문

#include "Bureaucrat.hpp"

int main(void)
{
    try
    {
        Bureaucrat test("test", 151);
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
    return (0);
}
  1. 예외를 throw 할 것 같은 곳에 try block으로 감싼다.

  2. 예외가 발생했을 경우에만 실행할 코드를 catch block 으로 감싼다.

  3. exception& e 는 프로그램이 던지는 에러를 받아주는 객체이다.

  4. try/catch 구문은 if 문 처럼 state가 한줄이더라도 꼭 {} 로 감싸줘야 한다.

Previous[CPP-03] (ClapTrap이 뭐지) 다중 상속과 가상 상속Next[CPP-00] 객체지향의 관점으로 클래스 이해하기

Last updated 3 years ago

Was this helpful?

what 함수의 레퍼런스와 반환값은 다음과 같다. ()

출처