2016-01-15 5 views
2

я пытаюсь просто передать функцию метания в качестве аргумента другой функции, которая будет справляться с обработкой ошибок Свифта:Передача метания функции в качестве аргументов

enum Err: ErrorType { 
    case pfui 
} 

func bad(i: Int) throws -> String { 
    if i < 10 { 
     return String(i) 
    } else { 
     throw Err.pfui 
    } 
} 

func handle(@autoclosure f:() throws -> String) -> String { 
    do { 
     return try f() 
    } 
    catch { 
     return "oh snap" 
    } 
} 


// error: call can throw but is not marked with 'try' 
handle(bad(3)) 

Это должно быть что-то простое, что мне не хватает, но почему-то атрибут autoclosure не позволяет компилятору думать, что я на самом деле его называю.

ответ

2

Ну, в конце концов, я нашел его сам.

handle(try bad(3)) 

делает трюк. Оглядываясь назад, компилятор действительно рассказывал мне, что делать для изменения. Я все еще не могу понять, почему я должен отмечать имя частично примененной функции с try в месте, которое не является сайтом вызова.

3

Вы также можете использовать ключевое слово rethrows на handle, чтобы указать, что если замыкание является функцией метания, handle будет «вновь бросить» его. Если вы это сделаете, вам не нужно поймать ошибку внутри handle. Так что все зависит от того, где вы хотите, чтобы поймать ошибку:

func handle(@autoclosure f:() throws -> String) rethrows -> String { 
    return try f() 
} 

do { 
    try handle(bad(11)) 
} catch { 
    print("\(error)")  // prints "pfui" 
} 

Я предполагаю, что это просто зависит от того, где вы хотите сделать вашу обработку ошибок. Вы хотите, чтобы все ошибки обрабатывались внутри handle, или вы хотите иметь возможность обрабатывать их за пределами handle?

+0

Идея заключалась в том, чтобы обрабатывать ошибку внутри 'handle', поэтому' rethrows' не то, что я искал. Код уменьшен, чтобы проиллюстрировать проблему; в моем приложении я использую функцию дескриптора, чтобы изменить модель обработки ошибок из 'do' /' try'/'catch' swift, которая мне не нравится, к модели, основанной на« Result ». –

+0

Это проясняет ситуацию. Я оставлю ответ на случай, если другие заинтересованы в ключевом слове 'rethrows'. Удачи :) –

Смежные вопросы