Skip to content

[LEVEL 1] 15 - Error #35

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

[LEVEL 1] 15 - Error #35

wants to merge 1 commit into from

Conversation

Hoon94
Copy link
Collaborator

@Hoon94 Hoon94 commented Jan 6, 2025

close #17

15-Error

1. Swift의 에러 처리 방법에 대해 설명해주세요.

Swift에서 에러 처리는 프로그램 실행 중 발생할 수 있는 예외 상황에 대비하여 오류가 발생할 수 있는 부분을 명시적으로 표현하고 이를 강제적으로 처리하도록 하여 안정적으로 코드가 실행될 수 있도록 도와줍니다. Swift는 명확하고 안전한 에러 처리를 제공하며, Error 프로토콜과 do-catch 구문, throws 키워드, try 구문 등을 사용해 에러를 처리합니다.

2. throws, try, catch 키워드의 사용 방법은 무엇인가요?

Error 프로토콜

  • Swift의 에러 타입은 Error 프로토콜을 준수하는 타입으로 정의됩니다.
  • enum을 사용해 에러의 종류를 구체적으로 정의하고, 상황에 맞게 사용할 수 있습니다.

throws 키워드

  • throws 키워드는 함수가 에러를 발생시킬 수 있음을 명시적으로 표시하며, 에러를 전파할 수 있는 함수를 정의합니다.
  • 함수 내부에서 에러가 발생할 가능성이 있는 코드를 포함하고, 호출 시 에러 처리를 요구합니다.

try 키워드

  • try 키워드는 에러가 발생할 수 있는 함수 호출 앞에 붙이며, 호출 시 에러가 발생할 경우 이를 상위 코드로 전달합니다.

  • 에러 처리 방법에 따라 try, try?, try!를 사용할 수 있습니다.

    • try: 에러를 던질 가능성이 있는 코드 앞에 사용하며, do-catch 구문으로 에러를 처리해야 합니다.
    • try?: 에러가 발생할 경우 nil을 반환하고, 옵셔널로 결과를 처리합니다.
    • try!: 에러가 발생하지 않을 것을 확실할 때 사용하며, 에러가 발생하면 런타임 오류가 발생합니다.

do-catch 구문

  • do-catch 구문은 에러가 발생할 가능성이 있는 코드를 실행하고, 에러가 발생할 경우 해당 에러를 처리하는 구문입니다.
  • catch 블록에서 특정 에러를 처리할 수 있으며, 에러의 종류에 따라 분기 처리가 가능합니다.

defer 구문

  • defer 구문은 코드 블록이 종료되기 직전에 실행할 코드를 작성할 때 사용합니다. 예를 들어, 파일 닫기, 리소스 해제와 같은 작업을 수행할 때 유용합니다.

  • do-catch 구문 내부에서도 defer를 사용하여 에러 발생 여부와 관계없이 마지막에 반드시 실행될 코드를 지정할 수 있습니다.

    func processFile(filename: String) throws {
        if exists(filename) {
            let file = open(filename)
            defer {
                close(file)
            }
            while let line = try file.readline() {
                // Work with the file.
            }
            // close(file) is called here, at the end of the scope.
        }
    }

3. 옵셔널을 사용한 에러 처리와 do-catch를 사용하는 에러 처리의 차이는 무엇인가요?

옵셔널을 사용한 에러 처리와 do-catch를 사용한 에러 처리의 가장 큰 차이는 에러의 발생 여부를 어떻게 다루고, 에러에 대해 얼마나 상세히 처리할 수 있는지 여부입니다. 옵셔널은 에러 발생 시 nil로 결과를 표현하는 반면, do-catch는 에러를 구체적으로 처리할 수 있는 구조를 제공합니다. 이 차이는 주로 에러를 간단히 무시할지 또는 에러를 구체적으로 다뤄야 하는지에 따라 선택할 수 있습니다.

옵셔널을 사용한 에러 처리 (try?)

try? 키워드를 사용하면, 에러가 발생할 수 있는 함수 호출 결과를 옵셔널 타입으로 반환합니다. 이 방식은 에러가 발생했을 때 해당 값을 nil로 표현하여, 에러에 대한 구체적인 처리를 생략하고 단순히 값이 없음을 표시하는데 유용합니다.

장점: 코드가 간견해지고, 에러 발생 여부를 무시하고 간단하게 nil로 처리할 수 있습니다.
단점: 에러가 발생한 원인을 알 수 없고, 에러에 대한 구체적인 처리가 어렵습니다.

do-catch를 사용한 에러 처리

do-catch 구문은 에러를 명시적으로 처리하고, 발생한 에러를 분기하여 상세히 다룰 수 있는 구조를 제공합니다. do 블럭 내에서 에러가 발생하면 catch 블럭에서 해당 에러를 잡아내며, 에러의 종류에 따라 다양한 대응 방식을 지정할 수 있습니다.

장점: 에러의 원인과 종류에 따라 구체적인 처리가 가능하며, 필요한 대응을 설정할 수 있습니다.
단점: 코드가 다소 길어지지만, 에러 처리가 필요한 상황에서는 명확하고 안정적인 구조를 제공합니다.

4. 에러를 전파하는 방법은 무엇인가요?

에러 전파는 하위 함수에서 발생한 에러를 상위 함수로 전달하여, 상위 함수에서 에러를 처리하도록 하는 방법입니다. Swift에서는 throws 키워드를 통해 에러를 발생시키고 전파할 수 있으며, 호출한 함수 쪽에서 이를 전달 받아 적절히 처리하게 됩니다.

Swift에서 에러를 전파하는 방법

에러 전파는 throws와 try 키워드를 사용해 구현됩니다.

1. throws 키워드로 에러가 발생할 수 있음을 표시합니다.
    - 함수 선언에서 throws 키워드를 사용해 해당 함수가 에러를 던질 수 있음을 표시합니다. 이 함수는 에러가 발생할 경우 이를 상위로 전파할 수 있습니다.
2. 호출 시 try 키워드를 통해 에러가 발생할 수 있음을 표시합니다.
    - throws 함수는 호출 시 try 키워드를 통해 호출해야 합니다. try는 에러가 발생할 수 있음을 나타내며, 호출한 함수로 에러를 전파하거나 처리할 준비를 하게 합니다.
3. 상위 함수에서 에러 처리
    - 상위 함수는 do-catch 구문을 사용해 에러를 처리하거나, 또다시 throws로 에러를 전파할 수 있습니다. 이처럼 에러를 연쇄적으로 전파하여 최종적으로 한 곳에서 처리하는 방식으로 구현할 수 있습니다.

에러 전파는 하위 함수에서 발생한 에러를 상위 함수에서 처리하도록 전달함으로써, 코드의 흐름을 일관성 있게 관리하고 에러를 한 곳에서 효과적으로 처리할 수 있도록 만듭니다.

@Hoon94 Hoon94 added the LEVEL 1 label Jan 6, 2025
@Hoon94 Hoon94 self-assigned this Jan 6, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[LEVEL 1] 15. Error
2 participants