[C프로그래밍 스타일 문의] 상위함수에서 오류를 처리할지? 하위 함수에서 오류를 처리할지?

hernian의 이미지

안녕하세요

열심히 개발중에 저혼자 고민하는것 보다 많은분들의 의견을 들어보고 싶어서 글을 올립니다.

C언어 개발을 하다보면 하위 함수에서 오류가 발생 시

상위 함수에서 결과를 받아서 처리를 할지.. 하위함수에서 바로 처리하고 프로그램을 종료할지 고민하게 되는데요

무슨말이냐 하면

case1)

 상위 함수에서 하위함수의 return값을 받아 처리하는 경우
int main(int argc, char* argv[])
{
 
	if(call_issue() != 0){
		printf("error\n");
	}
 
	return 0;
}
 
int call_issue(){
	//error occur
	if(error occur){
		return 1;
	} else {
		return 0;
	}
}

case2)하위함수에서 알아서 처리하고 exit() 하는 경우

int main(int argc, char* argv[])
{
 
	call_issue();
 
	return 0;
}
 
void call_issue(){
	if(error occur){
		printf("error \n");
		exit(1);
	} 
}

문의1) "case1 이나 case2 중 무엇으로 해야지 좀더 효율적이다" 라는 방법론이 있나요?
- 물론 특정 경우에서는 무조건 case1로 해야하는 경우도 있고 case2로 해야하는 경우도 있지만
선택적인 상황이 발생한다면 무엇으로 하시는지?

문의2) 위와같은 코딩에 대한 고민거리들을 정리한 책같은 것이 있나요?

위와같이 문의 드립니다.

감사합니다.

익명 사용자의 이미지

함수건 클래스건 기능과 역할 따라 분리하는게 좋습니다.
한편, 함수건 프로그램이건 입구와 출구를 하나만 놓는게 유지보수 및 관리에 유리합니다.
그런 관점에서 보자면, 함수 내부에서 간단한 에러 처리라면 모를까
프로그램을 종료하는 것과 같은 큰 일을 처리하도록 하는건 별로 바람직해 보이지 않는군요.

(프로그래밍) 디자인 패턴에 관한 책들이 그에 대해 어느정도 도움이 될 것 같고,
거기에 더해 Test Drive Development (TDD)에 관한 책도 읽어두시면 좋을 것 같군요.

hernian의 이미지

답변 감사드립니다.

디자인패턴은 대부분 객체지향언어를 위주로 쓰여있더라고요

그래서 C 쪽에는 그런 패턴같은것이 없나 해서 여쭤본겁니다.

도움 많이됐습니다.

jick의 이미지

정답이 없는 문제입니다만... 제 취향은

(1) 하위 함수에서 해결할 수 있는 에러 -> 해결하고 리턴한다.
(2) 하위 함수에서는 해결할 수 없지만 상위 함수에서는 해결할 수 있는 에러 -> 에러코드를 리턴하면 호출한 쪽에서 에러처리 담당
(3) 어디서도 해결할 수 없는 에러 -> 어차피 프로그램이 죽어야 하므로 그냥 에러가 난 위치에서 바로 죽는다

3번의 경우 저는 그 자리에서 바로 죽는 걸 선호합니다. 어차피 에러코드를 돌려줘봤자 할 수 있는 일이 없기 때문이죠. 코드를 짜다 보면 엄청나게 많은 종류의 에러가 1번 아니면 3번이 되는데 (2번은 개나소나(?) 쓰는 범용 라이브러리를 만드는 경우가 아니면 생각보다 흔하지 않습니다) 그 경우에 매번 에러코드를 돌려주다 보면 코드만 쓸데없이 복잡해지고 나중에 "나는 에러코드를 돌려줬는데 받는 쪽에서 에러체크를 안하고 그냥 진행하다 맛이가는" 케이스가 반드시 나옵니다.

* 그리고 사족입니다만 ocure라는 단어는 없습니다.

hernian의 이미지

이런 occur 였군요 여태 모르고 썼네요.. ㅋㅋ

답변 감사드립니다.

BrownBear의 이미지

함수가 정상적으로 작동하지 않았고, 이를 사용자가 알 필요가 있다면 하위 함수에서 오류 번호를 돌려줘서 사용자에게 알리면 되겠지만 (Ex.로그인)

이래나 저래나 함수가 실패해서 프로그램이 앞으로의 동작을 더 이상 진행할 수 없다면 그냥 대강 알려주고 죽게하면됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.