1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

(Power BI) Mから始めよう #10 エラー処理とHTTPステータスコード

Last updated at Posted at 2021-12-08

(この記事は、2021/12/08に執筆しました)
image.png

 エラーが発生しないように記述する方がいいのですが、エラーの発生がどううしようもない場合、わざと発生させる場合などあります。エラーの発生の仕方と、対応方法を検討します。

1.エラーの発生のさせ方

 errorを使ってエラーを発生させます。

sample1-1
let
    Output = error "エラーメッセージ"
in
    Output

image.png

 エラーメッセージだけでなく、詳細を付けることもできます。

sample1-2
let
    Output = 
        error Error.Record(
            "ファイル読み込みエラー", 
            "ファイル名my.txtが見つかりません",
            "my.txt"
        )
in
    Output

image.png

 以下の書き方もできます。

sample1-3
let
    Output = 
        error [
            Reason = "ファイル読み込みエラー", 
            Message = "ファイル名my.txtが見つかりません",
            Detail = "my.txt"
        ]
in
    Output

2.tryとotherwiseによってエラーをつかまえる

 tryの後の処理でエラーが発生した場合、処理を中断せずにotherwiseの処理に移ります。以下の例では、"foo"という文字列に1を加算しようとしているので、エラーとなります。

sample2-1
try "foo"+1

image.png

 otherwiseをつかって、このエラーを処理します。

sample2-2
try 
    "foo"+1 
otherwise 
    "エラー発生"

image.png

 tryで返される値は、2-1でやったように、[HasError]にエラーが発生したかどうかのブーリアン型の値が入ります。
 エラーが発生していた場合は[Error]の中にReason
MessageDetailがレコードとして入っています。

sample2-3
let
Result = try "foo"+1,
Output = 
    if Result[HasError] then 
        "エラーメッセージ:" & Result[Error][Message]
    else 
        Result[Value]
in
    Output

image.png

3.エラー抑制(Error Containment)

 エラーが発生すると、エラーの発生した値にアクセスする部分にのみ影響し、影響しない部分は最後まで実行されます。

sample3-1
let
    Source = NotDefine(),
    Result = [
        Value1 = 25,
        Value2 = Source,
        Value3 = Value1 + Value2
    ]
in
    Result

image.png

 Sourceの値はエラーとなりますが、最後まで実行されて、Result[Value1]の値は25と表示されます。
 また、エラーが発生していても、その式が評価されなければ、何の影響も発生しません。下の例では、行の数を計算するのに項目の値は関係ないため、正常に値を返します。

sample3-2
let
  Data = #table({"Col1"}, {{"SomeValue"}, { error "bad" }})
in
  Table.RowCount(Data)

image.png

4.スコープ

 下の例では、テーブルの中の値の1つでエラーが発生しており、このコードは0を返すことを期待していますが、結果的にエラーを含むテーブルとして値が返されます。
 テーブル内のセルで発生したエラーは、テーブルの式レベルには影響を与えません。

sample4-1
let
  Data = #table({"Amount"}, {{10}, {error "help!"}, {error "save me!"}})
in
  try Data otherwise 0

image.png

 一方、次の式では、最後にList.Sumでテーブル内のセルの値を評価しているため、エラーが発生し、0が返されます。

sample4-2
let
  Data = #table({"Amount"}, {{10}, {error "help!"}, {error "save me!"}})
in
  try List.Sum(Data[Amount]) otherwise 0

image.png

 参考に、エラーを0に置き換えて集計するには、以下のようにやります。

sample4-3
let
    Data = 
        #table(
            {"Amount"}, 
            {
                {10}, 
                {error "help!"}, 
                {error "save me!"}
            }
        ),
    // 項目NewAmountを追加し、Amountの値を入れる。ただし、エラーの場合は0にする。
    ErrorsReplacedWithZero = 
        Table.AddColumn(
            Data, 
            "NewAmount", 
            (row) => try row[Amount] otherwise 0
        ),
    // 項目Amountを削除
    RemoveOldAmount = 
        Table.RemoveColumns(
            ErrorsReplacedWithZero, 
            {"Amount"}
        ),
    // 項目名をNewAmountからAmountに変更
    RenameNewAmount = 
        Table.RenameColumns(
            RemoveOldAmount, 
            {
                "NewAmount", 
                "Amount"
            }
        )
in
    List.Sum(RenameNewAmount[Amount]) // returns 10

5.Webコンテンツのレスポンスコードを取得する

Web,Contentsで404(Not Found)を発生させます。

sample5-1
let
    response = try Web.Contents(url)
in
    response

image.png

Web.Contentsではエラーが帰ってきません。Valueの中にステータスコードが入っているようです。以下のように、ManualStatusHandling、Metadataを使ってレスポンスコードを取り出します。

sample5-2
let
    Source = Web.Contents(url, [ManualStatusHandling={400,404,500}]),
    // 400 Bad Request, 404 Not Found, 500 Internal Server Error
    Response = Value.Metadata(Source)
in
    Response

image.png

レスポンスコードは、 Response.Statusにあることがわかります。

sample5-3
let
    response = Web.Contents(url, [ManualStatusHandling={400,404, 500}]),
    // 400 Bad Request, 404 Not Found, 500 Internal Server Error
    responseCode = Value.Metadata(response)[Response.Status]
in
    responseCode

image.png

 レスポンスコードを取り出すには、以下のようにします。

sample5-4
let
    Source = Web.Contents(#"url", [ManualStatusHandling={400,404,500}]),
    ResponseCode = Value.Metadata(Source)[Response.Status]
in
    ResponseCode

image.png

Try & Catch

関連記事

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?