Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

코드상에서 Error 처리 방법 및 기타 컨벤션 #32

Open
hochan222 opened this issue Feb 25, 2021 · 10 comments
Open

코드상에서 Error 처리 방법 및 기타 컨벤션 #32

hochan222 opened this issue Feb 25, 2021 · 10 comments
Labels

Comments

@hochan222
Copy link
Member

hochan222 commented Feb 25, 2021

에러 처리 방법을 일관되게 하면 좋을것 같아서 이슈 달았습니다.

if (logic() || logic2())
    message("~~~ Error", 1);

위 코드는 함수 반환값으로 한번에 message 함수를 통해 처리하는 방식입니다.
평소에는 어떻게 에러를 처리하시나요? (Class 나 구조체 안에 맴버변수로 관리.. try catch exception.. 등등)


또다른 하나는 class 의 메소드에서

this->m_server_socket

다음과 같이 불러올 수 있지만

m_server_socket

이렇게도 불러올 수 있는데 m_server_socket이 방식을 사용해도 되는지 아니면 모든 맴버 변수에 대해서 무조건 this를 붙일 것인지 정해주세요! 어떻게 하면 좋을까요?

@hochan222 hochan222 added the 10 minute task 10분안에 끝낼 수 있는 간단한 업무 label Feb 25, 2021
@hochan222 hochan222 added the help wanted Extra attention is needed label Feb 25, 2021
@hochan222 hochan222 changed the title 코드상에서 Error 처리 방법 코드상에서 Error 처리 방법 및 기타 컨벤션 Feb 25, 2021
@jwon42
Copy link
Collaborator

jwon42 commented Feb 25, 2021

try catch 를 사용하는게 더 c++ 에 맞을 것 같은데,
전 메세지함수만 간단하게 만들어 사용하는거에 더 익숙하긴 합니다.

그리고 bool 함수를 조건문에서 사용하는 경우에 따른 표기도 통일하면 좋을 것 같아요.
true 조건의 경우

if (ft::isprint(c))

false 조건의 경우

if (ft::isprint(c) == false)

@hochan222
Copy link
Member Author

hochan222 commented Feb 25, 2021

저는 보통 int형으로 반환하여
#include <cstdlib> 에 있는 EXIT_SUCCESS, EXIT_FAILURE를 사용해서 표현해왔습니다.

  • true 조건의 경우
if (ft::isprint(c) == EXIT_SUCCESS)
  • false 조건의 경우
if (ft::isprint(c) == EXIT_FAILURE)

생각해보니 c에는 bool이없어서 이렇게 코딩한것같아요.


저는 다 좋은것 같아요! 우선 if문 조건 부분은 정해주시면 select 코딩할때 맞춰서 코딩하겠습니다!

@jwon42
Copy link
Collaborator

jwon42 commented Feb 25, 2021

네 저도 c에서는 EXIT_SUCCESS, EXIT_FAILURE를 이용했었는데 bool함수엔 적용이 안되니..

false 조건의 경우는 가독성을 위해 아래처럼 false를 직접 표기하고

if (ft::isprint(c) == false)

true 조건의 경우에는 두 방법 중 하나를 선택하면 좋을 것 같아요. 전 둘 중엔 1번을 선호하긴 하는데 호리님은 어떠세요?

1. if (ft::isprint(c))
2. if (ft::isprint(c) == true)

@hochan222
Copy link
Member Author

저도 1번이 더 괜찮은것 같아요! 리턴형이 bool이니까 가독성고려해도 true 안써도 괜찮을것 같습니다!

@hochan222
Copy link
Member Author

hochan222 commented Feb 25, 2021

후보군 4개를 만들어 보았습니다. 선택해주세요..!

  • 1
    따로 로직안에 메세지를 넣는다.
bool 
Server::setServerSocket()
{
	if ((this->m_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
		perror("socket error");
		return (false);
	}  
	if (bind(
			this->m_server_socket, 
			(struct sockaddr *)&this->m_server_addr, 
                        sizeof(this->m_server_addr)
	    ) == -1)
	{
		perror("bind error");
		return (false);
	}   
	if (listen(this->m_server_socket, 5) == -1)
	{
		perror("listen error");
		return (false);
	}
	return (true);
}
  • 2
    함수 밖 범위에서 메세지 로직을 갖으며 미리 정의된 enum이나 define을 이용한다.
# define SUCCESS_RETURN 0
# define SOCKET_ERROR 1
# define BIND_ERROR 2
# define LISTEN_ERROR 3

int 
Server::setServerSocket()
{
	if ((this->m_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		return (SOCKET_ERROR);
	if (bind(
			this->m_server_socket, 
			(struct sockaddr *)&this->m_server_addr, 
                        sizeof(this->m_server_addr)
	    ) == -1)
		return (BIND_ERROR);
	if (listen(this->m_server_socket, 5) == -1)
		return (LISTEN_ERROR);
	return (SUCCESS_RETURN);
}
  • 3
    한 메소드 안에는 무조건 한 에러
bool 
Server::setServerSocket()
{
	if (
		((this->m_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) &&
		(bind(
			this->m_server_socket, 
			(struct sockaddr *)&this->m_server_addr, 
			sizeof(this->m_server_addr)
		) == -1) &&
		(listen(this->m_server_socket, 5) == -1)
	)
		return (true);
	return (false);
}
  • 4
    throw 이용
void 
Server::setServerSocket()
{
	if ((this->m_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		throw "socket error";
	if (bind(
			this->m_server_socket, 
			(struct sockaddr *)&this->m_server_addr, 
                        sizeof(this->m_server_addr)
	    ) == -1)
		throw "bind error"
	if (listen(this->m_server_socket, 5) == -1)
		throw "listen error";
}

@hochan222
Copy link
Member Author

hochan222 commented Feb 25, 2021

jwon

error handling

  • 1
  • 2
  • 3
  • 4

method안 member 변수무조건 this 사용

  • O
  • X

yechoi

error handling

  • 1
  • 2
  • 3
  • 4

method안 member 변수무조건 this 사용

  • O
  • X

holee

error handling

  • 1
  • 2
  • 3
  • 4

method안 member 변수무조건 this 사용

  • O
  • X

@yechoi42
Copy link
Member

주된 처리를 1,2 번으로 하되, 4번 방식도 때때로 필요할 것 같아요. 클래스 상에서 자주 발생하거나 중요한 오류는 exception 클래스를 따로 만들어서, try-catch 로 처리하면 좋을 것 같습니다.

@hochan222
Copy link
Member Author

hochan222 commented Feb 26, 2021

그러면 1번으로 해요! 2번같은 경우에는 따로 헤더를 만들어서 관리해줘야하는 부분이기때문에 1번하고 혼용하는것보다는 단독적으로 쓰는게 좋다고 생각합니다!

메세지 함수는 나중에 유틸에서 정해서 만들고 메세지와 함께 리턴하는 방식으로 코딩하겠습니다! 감사합니당


(+) true 하고 false 반환중에 어떤것을 에러시 반환으로 할까요?
우선은 false로 return 했습니다.

@hochan222 hochan222 added the Info label Mar 13, 2021
@jwon42 jwon42 reopened this Apr 6, 2021
@hochan222
Copy link
Member Author

오오 저희 뭔가 수정해야될 점이 있나요?

@jwon42 jwon42 removed 10 minute task 10분안에 끝낼 수 있는 간단한 업무 help wanted Extra attention is needed labels Apr 8, 2021
@jwon42
Copy link
Collaborator

jwon42 commented Apr 14, 2021

오오 저희 뭔가 수정해야될 점이 있나요?

아뇨 코드 작성하는데 계속 참고하려고 다시 오픈했어요..ㅎㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants