Elm-error-handling

提供:Dev Guides
移動先:案内検索

エルム-エラー処理

エラーは、プログラム内の予期しない状態です。 エラーは、コンパイル時または実行時に発生する可能性があります。 コンパイル時エラーは、プログラムのコンパイル中に発生し(たとえば、プログラムの構文のエラー)、実行時エラーはプログラムの実行中に発生します。 他のプログラミング言語とは異なり、Elmはランタイムエラーをスローしません。

ユーザーの年齢を受け入れるアプリケーションを検討してください。 年齢がゼロまたは負の場合、アプリケーションはエラーをスローする必要があります。 この場合、ユーザーが年齢としてゼロまたは負の値を入力すると、Elmアプリケーションはエラー処理の概念を使用して、実行時に明示的にエラーを発生させることができます。 エラー処理は、プログラムの実行中に予期しないことが発生した場合のアクションを指定します。

エルムプログラミング言語は、次の方法でエラーを処理します-

  • 多分
  • 結果

多分

アプリケーションの検索機能を検討してください。 検索キーワードが見つかった場合、検索関数は関連データを返します。それ以外の場合は何も返しません。 このユースケースは、MayBeタイプを使用してElmに実装できます。

構文

variable_name:MayBe data_type

タイプMayBeの変数は、次の値のいずれかを含めることができます-

  • Just some_Value-有効なデータがある場合に使用されます。
  • Nothing-値が存在しないか不明な場合に使用されます。 他のプログラミング言語ではnullと同等のものはありません。

次の例は、変数と関数でMayBe型を使用する方法を示しています。

ステップ1 *- *MayBeDemo.elm ファイルを作成し、次のコードを追加します

-- MayBeDemo.elm
module MayBeDemo exposing(..)
import Maybe

--declaring a MayBe variable and assigning value to it
userName : Maybe String
userName = Just "Mohtashim"

--declaring a MayBe variable and assigning value to it
userAge :Maybe Int
userAge = Just 20

--declaring a MayBe variable and assigning value to it
userSalary:Maybe Float
userSalary = Nothing

--declaring a custom type
type Country = India | China | SriLanka

--defining a function that takes a String parameter as input and returns a value of type MayBe

getCountryFromString : String -> Maybe Country
getCountryFromString p =
case p of
   "India"
      -> Just India
   "China"
      -> Just China
   "SriLanka"
      -> Just SriLanka
   _
      -> Nothing
  • ステップ2 *-elm replでモジュールをインポートし、以下のように実行します
E:\ElmWorks\ErroApp> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at
--------------------------------------------------------------------------------
> import MayBeDemo exposing(..)
> userName
Just "Mohtashim" : Maybe.Maybe String
> userAge
Just 20 : Maybe.Maybe Int
> userSalary
Nothing : Maybe.Maybe Float
> getCountryFromString "India"
Just India : Maybe.Maybe MayBeDemo.Country
> getCountryFromString "india"
Nothing : Maybe.Maybe MayBeDemo.Country

関数は、関数に渡された値がインド、中国、またはスリランカであるかどうかをチェックします。 パラメータの値がこれらのいずれとも一致しない場合、何も返しません。

結果

アプリケーションが何らかの条件を検証し、条件が満たされない場合にエラーを発生させる必要がある例を考えてみましょう。 これを実現するために、結果タイプを使用できます。 アプリケーションが明示的にエラーを発生させ、問題の詳細を返す必要がある場合は、結果タイプを使用する必要があります。

構文

Result型の宣言には、エラーのデータ型(通常はString)と、すべて正常に終了した場合に返される結果のデータ型の2つのパラメーターが必要です。

type Result error_type data_value_type
= Ok data_value
| Err error_message

結果タイプは、次の値のいずれかを返します-

  • Ok some_value-返される結果を表します
  • Err-予想される条件が満たされていない場合に返されるエラーメッセージを表します。

イラスト1

Elm REPLで次の例を試してください-

> String.toInt
<function> : String -> Result.Result String Int
-- successful result
> String.toInt "10"
Ok 10 : Result.Result String Int
-- unsuccessful result , Error
> String.toInt "a"
Err "could not convert string 'a' to an Int" : Result.Result String Int

渡されたパラメーターが有効な場合、String.toInt関数は整数値を返します。 パラメータが数値でない場合、関数はエラーを返します。

イラスト2

次の例では、年齢をパラメーターとして受け入れます。 この関数は、年齢が0〜135の場合に年齢を返し、それ以外の場合は適切なエラーメッセージを返します。

  • ステップ1 *-ResultDemo.elmファイルを作成し、次のコードを追加します。
--ResultDemo.elm
module ResultDemo exposing(..)

userId : Result String Int
userId = Ok 10

emailId : Result String Int
emailId = Err "Not valid emailId"

isReasonableAge : String -> Result String Int
isReasonableAge input =
   case String.toInt input of
      Err r ->
         Err "That is not a age!"

   Ok age ->
      if age < 0 then
         Err "Please try again ,age can't be negative"
      else if age > 135 then
         Err "Please try agian,age can't be this big.."

   else
      Ok age
  • ステップ2 *-モジュールをelmパッケージにインポートし、以下のように実行します
E:\ElmWorks\ElmRepo\15_ErrorHandling\15_Code> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> import ResultDemo exposing (..)
> userId
Ok 10 : Result.Result String Int
> emailId
Err "Not valid emailId" : Result.Result String Int
> isReasonableAge "10"
Ok 10 : Result.Result String Int
> isReasonableAge "abc"
Err "That is not a age!" : Result.Result String Int