Swift 2: 통화를 던질 수 있지만 '시도'로 표시되지 않고 오류가 처리되지 않습니다.
Xcode 7 베타를 설치하고 Swift 2로 swift 코드를 변환한 후 코드에 문제가 발생하여 파악할 수 없습니다.스위프트2는 새것인걸 알고 검색해보니 아무것도 없어서 질문을 써야겠네요.
다음은 오류입니다.
호출이 느려질 수 있지만 'try'로 표시되지 않고 오류가 처리되지 않습니다.
코드:
func deleteAccountDetail(){
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
//The Line Below is where i expect the error
let fetchedEntities = self.Context!.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
do {
try self.Context!.save()
} catch _ {
}
}
스냅샷:
이미 .save()
를 처리할 수 있기 , 당은할다있니습수에신문리하류면를지기러서▁call▁you▁can▁here,.try
다음과 같이 단일 Do-Do-Do-Do-Do-Do-Do-Do-Do-Block
func deleteAccountDetail() {
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
do {
let fetchedEntities = try self.Context!.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
try self.Context!.save()
} catch {
print(error)
}
}
또는 아래 댓글에서 @bames53이 지적했듯이, 오류가 발생한 곳에서 발견되지 않도록 연습하는 것이 더 나은 경우가 많습니다.메소드를 다음과 같이 표시할 수 있습니다.throws
그리고나서try
메소드를 호출합니다.예:
func deleteAccountDetail() throws {
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
let fetchedEntities = try Context.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
try self.Context!.save()
}
으로선함호출때할수로 할 때throws
호출 사이트에 .try
또는try!
예를 들어, 던지기 함수가 주어진 경우:
func willOnlyThrowIfTrue(value: Bool) throws {
if value { throw someError }
}
이 함수는 다음과 같이 호출될 수 있습니다.
func foo(value: Bool) throws {
try willOnlyThrowIfTrue(value)
}
서는 다으로통주달았다습니석을에화음▁with로 을 달았습니다.try
이것은 이 함수가 예외를 던질 수 있으며 코드의 다음 행이 실행되지 않을 수 있음을 독자에게 호출합니다.또한 이 함수에 다음과 같은 주석을 달아야 합니다.throws
왜면이함예던즉외수질때있다니문경입, 기다같은우를음수는)를 던질 수 때문입니다.willOnlyThrowIfTrue()
그 다음에 지면면, 러그던.foo
예외를 위쪽으로 자동으로 다시 던집니다.
이 있다고 에 자신의 수 을 알고 있는 를 부르고 던질가이성있선다지었만올입때케바언던제에있다수니않호있사습다함할알용것면려을음하출를수는을고을지지스이력능문공에른을하기고되▁that▁if▁▁you▁a▁use,▁is▁you▁can있다니▁possibly수습▁but▁throwing▁which▁as▁declared던질▁will사▁call할▁to▁because▁want,용▁throw▁input▁know다▁you을음▁in▁not면▁case▁you▁your▁it호려하출능가'함있를▁correcttry!
.
func bar() {
try! willOnlyThrowIfTrue(false)
}
이렇게 하면 코드가 느려지지 않을 것을 보장할 때 예외 전파를 비활성화하기 위해 추가 상용판 코드를 입력할 필요가 없습니다.
try!
됩니다: 를: 를 사용합니다.try!
그리고 함수는 결국 던져지고, 그러면 프로그램의 실행은 런타임 오류와 함께 종료됩니다.
대부분의 예외 처리 코드는 위와 같아야 합니다. 예외가 발생할 때 단순히 예외를 위쪽으로 전파하거나 가능한 예외가 제외되도록 조건을 설정합니다.는 객체 코의다리즉를정개파면를괴체려리하합다니, 개파괴체야해수행통해른스소드를즉▁any▁object)를 통해 수행해야 합니다.deinit()
) 또는 를 통해 때때로defer
암호문
func baz(value: Bool) throws {
var filePath = NSBundle.mainBundle().pathForResource("theFile", ofType:"txt")
var data = NSData(contentsOfFile:filePath)
try willOnlyThrowIfTrue(value)
// data and filePath automatically cleaned up, even when an exception occurs.
}
어떤 이유로든 실행해야 하지만 실행되지 않은 정리 코드가 있는 경우deinit()
함수, 사용할 수 있습니다.defer
.
func qux(value: Bool) throws {
defer {
print("this code runs when the function exits, even when it exits by an exception")
}
try willOnlyThrowIfTrue(value)
}
예외를 다루는 대부분의 코드는 단순히 그것들을 호출자들에게 위쪽으로 전파하고, 도중에 청소를 합니다.deinit()
또는defer
이는 대부분의 코드가 오류를 처리할 방법을 모르기 때문입니다. 오류가 발생한 원인은 알고 있지만 상위 수준의 코드가 오류에 대해 수행할 작업에 대한 충분한 정보가 없기 때문입니다.대화 상자를 사용자에게 표시하는 것이 적절한지, 다시 시도해야 하는지 또는 다른 대화 상자가 적절한지 알 수 없습니다.
그러나 상위 레벨 코드는 오류가 발생할 경우 무엇을 해야 하는지 정확히 알고 있어야 합니다.따라서 예외를 통해 특정 오류가 처음 발생한 위치에서 처리할 수 있는 위치로 거품이 일 수 있습니다.
는 예외처다통수다행니됩해음을리는을 통해 처리됩니다.catch
진술들.
func quux(value: Bool) {
do {
try willOnlyThrowIfTrue(value)
} catch {
// handle error
}
}
여러 개의 캐치 문을 가질 수 있으며, 각각 다른 종류의 예외를 캐치할 수 있습니다.
do {
try someFunctionThatThowsDifferentExceptions()
} catch MyErrorType.errorA {
// handle errorA
} catch MyErrorType.errorB {
// handle errorB
} catch {
// handle other errors
}
예외가 있는 모범 사례에 대한 자세한 내용은 http://exceptionsafecode.com/ 을 참조하십시오.특히 C++을 겨냥한 것인데 스위프트 예외 모델을 검토해보니 기본적인 사항은 스위프트에도 적용된다고 생각합니다.
Swift 구문 및 오류 처리 모델에 대한 자세한 내용은 The Swift Programming Language(Swift 2 사전 릴리스)를 참조하십시오.
언급URL : https://stackoverflow.com/questions/30737262/swift-2-call-can-throw-but-it-is-not-marked-with-try-and-the-error-is-not-ha
'programing' 카테고리의 다른 글
서버에 연결할 수 없음: dial tcp [:1]:8080:connectex: 대상 컴퓨터가 이를 적극적으로 거부했기 때문에 연결할 수 없습니다. (0) | 2023.05.11 |
---|---|
Mongoose 암호 해싱 (0) | 2023.05.11 |
Java용 Eclipse IDE - 완전 다크 테마 (0) | 2023.05.11 |
SQL Server 연결된 서버 예제 쿼리 (0) | 2023.05.11 |
Swift에 액세스 수식어가 있습니까? (0) | 2023.05.11 |