20. Exceptions & Namespaces
20 Sep 2019 | C++
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;
}
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
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