for Robot Artificial Inteligence

20. Exceptions & Namespaces

|

Exception

  • python try ~ except과 같은 원리이다
  • try ~ catch
    • try를 하고 오류가 생기면
    • Catch해서 break하겠다라는 의미이다.
    • python보다 추가된건 void 옆에 throw 를 지정해 줘서 catch에 날려버린다.

Example 1

Exception.cpp

#include <iostream>

using namespace std;

/* Exceptions - handling exceptions */
class DivisionByZeroException
{
    public:
        void getErrorMessage() { cout << "Error: Do not divide by zero"; }
};

double division(double a, double b) throw(DivisionByZeroException)
{
    if (b == 0)
        throw DivisionByZeroException();
    return a / b;
}
int main()
{
    double result;

    try
    {
        result = division(5, 0);

        cout << "the result is " << result << endl;
    }
    catch(DivisionByZeroException e)
    {
        e.getErrorMessage();
    }
    catch(...)
    {
        cout << "This is a message that will be shown, when other catch instructions wont be invoked " << endl;
    }
//    cout << "lalal" << endl;

    return 0;
}

Namespaces

  • namespace는 같은 이름을 충돌하지 않게 하는 문법입니다.
  • 많은 라이브러리를 만들어지고 있는데 서로 다른 라이브러리에 같은 이름의 형식이나 개체가 있을 때 충돌이 나지 않게 namespace로 감싸게 하여 충돌나지 않게 할 수 있습니다.
  • 먼저 namespace 문법을 사용하지 않았을 때 같은 이름의 형식을 정의하여 충돌하는 예입니다.
//namespace를 사용하지 않아 이름 충돌
//Program.cpp
#include <iostream>
using namespace std;

struct Stack
{
    int top;
};

struct Stack //이미 앞에서 같은 이름으로 정의하고 있음
{
    int last;
};
int main()
{
    return 0;
}
  • 이를 다음처럼 namespace로 감싸서 정의하면 이름 충돌이 발생하지 않습니다 ``` namespace DemoA { struct Stack { int top; }; }

namespace DemoB { struct Stack //이미 앞에서 같은 이름으로 정의하고 있음 { int last; }; }

- 이제 namespace로 감싸서 정의한 이름을 사용하는 방법을 알아봅시다.
- 먼저 네임 스페이스 이름과 스코프 연산자(::)를 사용해서 접근할 수 있습니다.

//namespace를 사용하여 이름 충돌 방지 //namespace 이름과 스코프 연산으로 사용한 예 //Program.cpp #include using namespace std;

namespace DemoA { struct Stack { int top; }; }

namespace DemoB { struct Stack //이미 앞에서 같은 이름으로 정의하고 있음 { int last; }; }

int main() { DemoA::Stack stacka; //namespcae 명과 스코프 연산자로 이름 사용 DemoB::Stack stackb;

stacka.top = -1;
stackb.last = -1;

return 0; } ``` - 그리고 특정 네임 스페이스에 있는 모든 이름을 간단히 사용할 수 있게 using 문을 사용할 수 있습니다. - using namespace 뒤에 네임 스페이스 이름을 표현하면 모두 사용할 수 있습니다.
//using namespace문을 이용하여 간단히 사용
//Program.cpp
#include <iostream>
using namespace std;

namespace DemoLib
{
    struct Stack
    {
        int top;
    };
    struct Queue
    {
        int front;
        int rear;
    };
}

//DemoLib 네임 스페이스에 이름을 사용하겠다는 구문
using namespace DemoLib;

int main()
{
    Stack s; //네임 스페이스 명과 스코프 연산없이 이름을 바로 사용
    Queue q;
    s.top = -1;
    q.front = q.rear=0;

    return 0;
}
  • 그리고 using [네임 스페이스 명]::[사용할 이름]; 을 선언하여 네임 스페이스 내부에 있는 특정 이름만 간단하게 사용할 수도 있습니다.
//using [namespace 명]::사용할 이름; 으로 특정 이름만 간단히 사용
//Program.cpp
#include <iostream>
using namespace std;

namespace DemoLib
{
    struct Stack
    {
        int top;
    };
    struct Queue
    {
        int front;
        int rear;
    };
}

//DemoLib 네임 스페이스에 Stack 이름을 사용하겠다는 구문
using DemoLib::Stack;

int main()
{
    Stack s; //네임 스페이스 명과 스코프 연산없이 이름을 바로 사용
    DemoLib::Queue q; //네임 스페이스 명과 스코프 연산과 함께 이름을 사용
    s.top = -1;
    q.front = q.rear=0;

    return 0;
}

Example

#include <iostream>


/*namespaces */

namespace mySpace
{
    class MyNewLine
    {
            std::string text;
        public:
            MyNewLine(std::string text = "\n\n\n") { this->text = text;}
            std::string toString()
            {
                return text;
            }
    };

    std::ostream & operator<<(std::ostream & out, MyNewLine & o)
    {
        return out << o.toString();
    }
    MyNewLine endl("\n\n\n\n\n\n");
}
using namespace mySpace;
int main()
{
    int a = 50;


    std::cout << "this is text: " << endl;
    return 0;
}

Example 1

#include <iostream>
#include <string>
using namespace std;

void mightGoWrong() {

	bool error1 = false;
	bool error2 = true;

	if(error1) {
		throw "Something went wrong.";
	}

	if(error2) {
		//throw string("Something else went wrong.");
		throw int ("4");
	}

}

void usesMightGoWrong() {
	mightGoWrong();
}



int main() {

	try {
		usesMightGoWrong();
	}
	catch(int e) { // the throwing the value catched and apply to "int e"
		cout << "Error code: " << e << endl;
	}
	catch(char const * e) { // character, so it save one by one alpabet in one matrix place
		cout << "Error message: " << e << endl;
	}
	catch(string &e) { // c++ does not gracefully handle situation where there are two exceptions active at the same time in string.
	    //it imeediatley terminates the program without calling any destructor
		cout << "string error message: " << e << endl;
	}

	cout << "Still running" << endl;

	return 0;
}

Comments