session_id} = ElixirDropbox.Files.Up-6ren">
gpt4 book ai didi

elixir - 与和尝试/救援在 Elixir 中可以相同

转载 作者:行者123 更新时间:2023-12-01 14:37:36 24 4
gpt4 key购买 nike

我正在尝试处理由 HTTPPoison.request!

导致的错误
try do
%{"session_id" => session_id} = ElixirDropbox.Files.UploadSession.start(client, true, image_save_path)
write_sessional_values(session_id, file_size, "/#{construction}/#{camera_exid}/#{id}/#{starting}.jpg", path)
check_1000_chunk(path) |> length() |> commit_if_1000(client, path)
rescue
_ ->
:timer.sleep(:timer.seconds(3))
upload(200, response, starting, camera_exid, id, requestor)
end

我的问题是:我完全无视救援中的异常,重新做我想做的手术。

与...相同

with {:ok, file_size} <- get_file_size(image_save_path),
%{"session_id" => session_id} <- ElixirDropbox.Files.UploadSession.start(client, true, image_save_path) do
write_sessional_values(session_id, file_size, "/#{construction}/#{camera_exid}/#{id}/#{starting}.jpg", path)
check_1000_chunk(path) |> length() |> commit_if_1000(client, path)
else
_ ->
:timer.sleep(:timer.seconds(3))
upload(200, response, starting, camera_exid, id, requestor)
end

我完全忽略了 with else 部分中的内容,在哪些情况下使用这两种方法的坚实基础是什么?

最佳答案

with 当您想要确保在执行任务之前有多个步骤确保正确的数据在您的应用程序中可用时使用。一个常见的例子是确保 map 中存在字段:

with {:ok, width} when not is_nil(width) <- Map.fetch(data, :width),
{:ok, height} when not is_nil(height) <- Map.fetch(data, :height) do
{:ok, width * height}
else
_error ->
{:error, "This data does not have the correct values"}
end

您想在抛出要从中恢复的异常时使用救援。以下是您希望对相同操作使用救援的示例:

try do
width = Map.fetch!(data, :width)
height = Map.fetch!(data, :height)
{:ok, width * height}
rescue
%KeyError{message: message} ->
{:error, message}
end

一般来说,我更喜欢以不使用救援 block 的方式构建我的应用程序。我想知道我编写的应用程序何时抛出错误,以便我可以修复某些问题。我认为应该预料到错误,异常应该表明您有错误。

但是,如果您正在使用会抛出异常的第三方库,那么使用救援 block 就可以了。

Elixir 文档在谈论错误时非常有用 https://elixir-lang.org/getting-started/try-catch-and-rescue.html#errors

在您提供的示例中,我建议您使用 with block ,因为您预计上传可能会失败。此外,我建议您指定一个 max_retries 变量,该变量在达到时会抛出异常,这样您就不会无休止地尝试上传某些内容。

附带说明一下,我认为拯救某些东西的推荐方法是在函数中执行,而不是像这样的 try/rescue block :

def my_func(a) do
do_something(a)
rescue
%Exception{} ->
{:error, "ERROR"}
end

希望对您有所帮助。

干杯!

关于elixir - 与和尝试/救援在 Elixir 中可以相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57434831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com