2015-08-27 3 views
1

Мой код ниже.Swift 2.0 обработка ошибок

enum NutritionalError: ErrorType { 
    case NotEnoughNutrients 
    case TooMuchNutrients 
    case Other 
} 

Как вы можете видеть, у меня есть NutritionalError of ErrorType с тремя различными случаями.

У меня есть функция обработки ошибок, которая работает как таковая.

func needs(fat: Double, carbohydrate: Double, protein: Double) throws { 
    let totalPercent = fat + carbohydrate + protein 

    guard totalPercent > 1 else { 
     throw NutritionalError.TooMuchNutrients 
    } 

    guard totalPercent < 1 else { 
     throw NutritionalError.NotEnoughNutrients 
    } 
} 

func calculateNeeds(calories: Int, fatPercent: Double, carbohydratePercent: Double, proteinPercent: Double) -> (Int, Int, Int) { 
    do { 
     try needs(fatPercent, carbohydrate: carbohydratePercent, protein: proteinPercent) 
    } catch NutritionalError.NotEnoughNutrients { 
     print("Not enought nutrients.") 
    } catch NutritionalError.TooMuchNutrients { 
     print("Too many nutrients.") 
    } 
} 

На линии.

  try needs(fatPercent, carbohydrate: carbohydratePercent, protein: proteinPercent) 

Я получаю сообщение об ошибке.

'Errors thrown from here are not handled because the enclosing catch is not exhaustive' 

ответ

3

Как и ошибки, вы должны добавить окончательный catch без ограничений.

+0

спасибо. Я только что нашел это, но я думаю, что у многих людей будет такая проблема, поэтому я буду поддерживать это. Также я посмотрел ваш профиль и возобновил работу, и я должен сказать «Впечатляюще»! –

+0

На самом деле это не то, о чем говорит ошибка. В нем говорится, что он «не является исчерпывающим», что может означать многие вещи, а не только необходимость использования ограниченного улова. –

2

Я нашел ответ, который добавит эту строку.

catch { 
    print("Another error") 
} 

Поэтому у вас должно быть заявление о выводе для всех.

+1

Да, Swift пытается охватить все возможности, то же самое с операторами 'switch'. – zaph

+0

Вместо этого вы можете использовать «catch Other». Дело в том, чтобы быть исчерпывающим (все возможности) не просто общим уловом. –

0

Даже если вы поймаете все ошибки индивидуально, компилятор все еще считает, что может произойти ошибка, которая может пройти через этот блок. Я не эксперт в стрижа, но найти способ поймать все ошибки, охватывающие как catch (Error e) (это пример, и, вероятно, не работает)

0

Я думал, что он пропустил, добавив следующую строку:

поймать NutritionalError.error

+0

Нет, это не решает проблему вообще. Но добавляет ошибку «enum case for» error, не найденной в типе «ErrorType», и до сих пор не решает исходную ошибку. –

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