gpt4 book ai didi

c# - 使用不同的 Try 语句和相同的 Catch 语句进行 DRY

转载 作者:太空狗 更新时间:2023-10-29 23:15:40 24 4
gpt4 key购买 nike

所以我在方法中有以下代码块:(所有变量都是本地变量)

// ...

try
{
if (postXml != null)
using (StreamWriter writer = new StreamWriter(req.GetRequestStream()))
writer.Write(postXml.ToString());
}
catch (WebException ex)
{
HttpWebResponse response = ex.Response as HttpWebResponse;
if (response != null)
result = HandleOtherResponse(response, out status);
else result = HandleBadResponse(ex.ToString(), out status);
}
catch (Exception ex)
{
result = HandleBadResponse(ex.ToString(), out status);
}

if (result == null)
{
try
{
HttpWebResponse response = req.GetResponse() as HttpWebResponse;
result = HandleOtherResponse(response, out status);
}
catch (WebException ex)
{
HttpWebResponse response = ex.Response as HttpWebResponse;
if (response != null)
result = HandleOtherResponse(response, out status);
else result = HandleBadResponse(ex.ToString(), out status);
}
catch (Exception ex)
{
result = HandleBadResponse(ex.ToString(), out status);
}
}

// ...

可以看到,两条try语句是不同的,但是两组catch语句是完全一样的。我一直在试图想出一种可能不会在这里重复我自己的方法,但我还没有真正想到一种不会显着变慢或看起来很糟糕的方法。想知道是否有人有任何想法。

最佳答案

一种方法是编写一个“安全的”调用方法并将一个函数传递给它:

public T SafeInvocation(Func<T> myMethod)
{
T result = default(T);

try
{
// Invoke method
result = myMethod();
}
catch
{
// Do your common catch here
}

return result;
}

为 Action 构建一个额外的重载,这样您就不需要返回类型了。然后你可以在别处调用它,将方法作为参数传递给你的方法(Inception?):

SafeInvocation(() => 
{
if (postXml != null)
using (StreamWriter writer = new StreamWriter(req.GetRequestStream()))
writer.Write(postXml.ToString());
}

关于c# - 使用不同的 Try 语句和相同的 Catch 语句进行 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330539/

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