[go] 시그널 처리와 예외 처리의 차이

시그널 처리와 예외 처리는 프로그램이 비정상적인 상황에 대응하는 데 사용되는 두 가지 다른 메커니즘입니다. 시그널은 운영 체제로부터 프로세스에 알리는 데 사용되는 소프트웨어 인터럽트이고, 예외는 프로그램 내부에서 발생하는 오류를 다루는 데 사용됩니다.

시그널 처리

시그널은 운영 체제나 다른 프로세스에 의해 발생하는 이벤트로, 프로세스가 중단되거나 종료되는 동작을 수행하도록 합니다. 시그널은 비동기적으로 발생하며, 프로세스가 시그널을 받을 때 어떻게 반응할지에 대한 사전에 지정된 동작을 위한 핸들러를 등록할 수 있습니다.

package main

import (
	"fmt"
	"os"
	"os/signal"
"syscall"
	"time"
)

func main() {
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt, syscall.SIGTERM)

	go func() {
		for sig := range c {
			fmt.Println("Received signal:", sig)
		}
	}()

	fmt.Println("Waiting for signal")
	<-time.After(2 * time.Minute) // Waiting for 2 minutes
}

예외 처리

예외는 프로그램 내부에서 발생하는 오류 또는 예기치 않은 상황을 나타내며, 일반적인 프로그램 흐름을 방해할 수 있습니다. 예외는 일반적으로 try-catch 블록을 사용하여 처리되며, 예외가 발생하면 해당 블록 내에서 적절한 조치를 취할 수 있습니다.

package main

import "fmt"

func main() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()
	panic("Something went wrong")
}

결론

시그널 처리는 운영 체제나 다른 프로세스로부터 외부 이벤트를 처리하고, 프로세스의 동작을 제어하는 데 사용됩니다. 반면에 예외 처리는 프로그램 내부에서 발생하는 오류나 예기치 않은 상황을 다루는 데 사용됩니다. 두 메커니즘은 서로 다른 상황에서 사용되며, 각각의 특징에 따라 적합한 상황이 있습니다.

이러한 메커니즘을 올바르게 이해하고 활용함으로써 안정적이고 효율적인 프로그램을 개발할 수 있습니다.

참고: Go 언어 공식 문서