티스토리 뷰
type error
error 타입은 비정상적인 상태를 나타낸다. Go는 try-catch-finally처럼 예외처리를 할 수 있는 구문이 없다. 대신 error 타입 값으로 에러 상태를 표현하고 처리를 한다. Go 에서는 Error() string 메서드를 가지고 있다면 에러로 사용될 수 있다.
위는 내장 타입이다. type error은 Error() string를 가지고 있다. 내장 인터페이스 타입인 error은 에러 상황을 나타내는 인터페이스 이고, 에러가 없다면 nil 값으로 나타낸다라고 적혀 있다.
위에는 에러 타입의 한 종류이다. PathError은 Error() string 메서드를 가지고 있다.
Go에서 함수나 메서드의 마지막 반환 값으로 에러 상태를 리턴하는데, 에러가 발생하지 않았다면 nil을 리턴하고 에러가 발생하면 상태를 표현하는 error 값을 리턴한다.
위의 코드는 filename.txt라는 파일을 여는 에러이다. 디렉토리에는 해당 파일이 존재하지 않기 때문에 os.Open은 에러를 발생한다. 다만, 위의 코드에서 에러가 발생하더라도 실행 중에 프로그램이 중단되지는 않는다.
만약, 상대경로로 파일이 인식 되지 않으면 root 디렉토리로부터 시작되는 경로를 적으면 된다
err 값은 nil이 아니고 터미널에는 위와 같이 그러한 파일이나 디렉토리가 없다고 출력된다.
파일을 생성하고 위의 코드를 실행하면 else 문이 실행된다. 그리고 nil이 출력되는 것을 볼 수 있다.
에러 생성
에러는 다음과 같은 방법들을 사용해서 생성할 수 있다.
1. errors 패키지의 New() 함수 사용
2. fmt 패키지의 Errorf 사용
3. 에러를 직접 정의
errors 패키지의 New() 함수 사용
errors 패키지를 가면 위와 같이 정의되어 있다. errors.New() 함수를 사용하면 error 타입의 errorString 구조체가 생성된다.
errors.New() 안에는 에러 메시지를 전달하면 된다. 생성한 myError을 출력하면 위와 같이 에러의 메시지가 출력된다. 에러를 그대로 출력하는 것과 Error() 메서드를 사용하여 출력하는 것 둘 다 똑같은 결과가 나타나는 것을 볼 수 있다.
Pay 메서드는 balance 보다 cost가 크다면 잔액이 부족하다는 메시지를 출력한다. 작다면 balance에서 cost를 뺀 값을 리턴하고 에러가 발생하지 않았기 때문에 nil을 리턴한다. balance가 10000원이고 cost가 20000원일 때, error을 출력하면 위와 같이 잔액이 부족하다는 메시지를 볼 수 있다.
fmt 패키지의 Errorf() 사용
errors.New() 메서드가 아니라 fmt.Errorf() 메서드를 사용해서도 에러 메시지를 출력할 수 있다. 위의 메서드는 똑같은 기능을 수행한다.
에러를 직접 정의
Error() string 메서드를 가진 타입은 에러로 사용이 가능하다. NotEoughMoneyError라는 구조체를 만든뒤 Error() string 메서드를 정의한다. 이렇게 생성한 구조체에 message를 담아 에러를 만들 수 있다.
panic
패닉(panic)은 런타임에 발생하는 에러이다. 패닉은 컴파일러가 프로그램을 컴파일하는 동안 감지할 수 없는 상황이다. 패닉이 발생하면 패닉 메시지와 함께 프로그램이 종료된다.
0으로 나눗셈을 하면 division by zero라는 메시지와 함께 프로그램이 종료된다.
프로그램이 실행될 수 없는 상황에서 panic 함수를 사용하여 패닉을 발생하고 프로그램을 종료시킬 수 있다. 이 panic 함수에는 이전에 error 메시지를 넣은 것 처럼 패닉 메시지를 입력하면 된다.
panic 메서드를 사용하면 Hello가 출력되고 두번째 줄 panic 함수가 실행되어 패닉 메시지를 출력하고 프로그램이 종료된다. 문자열 Bye는 출력되지 않는 것을 확인할 수 있다.
에러와 함께 에러 발생시 패닉을 호출하여 프로그램을 종료하는 방식으로 에러와 패닉을 조합하여 사용할 수 있다.
panicking
패닉이 발생하면 모든 defer 구문을 실행한 후 자신을 호출한 함수로 패닉에 대한 제어권을 넘긴다. 이렇게 호출한 함수를 타고 타면서 프로그램 스택의 최상단인 main 함수에서 프로그램을 종료하고 에러를 출력하게 된다. 이를 panicking이라고 한다.
recover
recover은 패닉으로부터 제어권을 얻어 프로그램을 종료하지 않고 계속 실행할 수 있도록 한다. recover은 defer 안에서 실행되어야만 한다. recover로 복원하면 패닉이 종료되고 함수 리턴타입의 제로값이 리턴된다.
패닉이 발생했을 때 defer의 recover에서 error 메시지를 출력한다. 그리고 함수는 int의 제로값인 0을 리턴한다.
- Total
- Today
- Yesterday
- Python
- 2차 인터뷰
- 네이버 2022 공채
- mysql
- github
- postman collection
- git
- Squash and merge
- 코딩테스트
- squash merge
- DGS Framework
- 코틀린
- 주생성자
- 확장 함수
- solidity
- pm.test
- downTo
- Kotlin
- pm.expect
- go 특징
- java
- Kotlin In Action
- string
- graphql
- hashcode
- postman tests
- postman
- 1차 인터뷰
- python3
- Basic Type
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |