我目前正在进行代码审查,以下代码让我跳了起来.我看到这个代码存在多个问题.你是否同意我的观点?如果是这样,我如何向我的同事解释这是错误的(顽固型......)?
码:
try
{
// Call to a WebService
}
catch (Exception ex)
{
if (ex is SoapException || ex is HttpException || ex is WebException)
{
// Log Error and eat it.
}
else
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 这不是'如何抓住所有例外',而是'你应该抓住所有例外'吗?在C#.NET中,我注意到了大量的异常.是否可以计划捕获每个例外?
例如,DirectoryInfo()构造函数抛出4个异常.我应该计划捕捉这些还是只抓住我能处理的那些?也许让其他人冒泡到Main()我所有的地方,然后告诉用户有一个未捕获的异常.在所有这些可能的例外情况下,您的代码可能会变得比实际代码更多的异常处理.
使用TPL/Tasks我可以使用内部try/catch语句执行异常处理:
Task.Factory.StartNew(
()=>
{
try
{
// Do stuff
}
catch
{
// Handle exception
}
});
Run Code Online (Sandbox Code Playgroud)
或使用ContinueWith,如下所示:
Task.Factory.StartNew(
()=>
{
// Do stuff
}).ContinueWith(
task =>
{
if(task.Exception != null)
// Handle exception
});
Run Code Online (Sandbox Code Playgroud)
更推荐使用哪种方法?每个人的缺点和优点是什么?
我想问一些关于泛型的问题。
我试图保持代码简单,因此我将创建一个类来处理游戏保存游戏文件的加载/保存。由于游戏的每个部分都有不同的要求,我希望尽可能轻松地访问它:
public void Load<T>(string path, out T obj)
{
BinaryFormatter bf = new BinaryFormatter();
using (FileStream file = File.Open(Application.persistentDataPath + path, FileMode.Open))
{
obj = (T)bf.Deserialize(file);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以用一个简单的方法来调用它
TurnData x; s.Load("test.txt", out x);
Run Code Online (Sandbox Code Playgroud)
另一种方法是让 Load 函数返回对象,然后将其转换为 TurnData 类型。
TurnData x = (TurnData)s.Load("test.txt");
Run Code Online (Sandbox Code Playgroud)
我对 C# 不太了解。我假设如果打开文件时出现错误,则内部代码using(...) { ... }不会被执行?如果有人能证实这一点那就太好了。我看到的示例代码没有任何错误处理,这对我来说很奇怪,所以我添加了 using?
那么,在这个辅助版本中,函数返回对象而不是使用输出参数,将需要更复杂的代码来进行错误检查并可能返回 null?看起来不太好。
所以真正的问题是......我可以使用我这里的下一个版本吗?或者由于使用泛型而我应该担心吗?
下面是我的代码片段,我想知道的是,假设如果函数 main2() 由于某种原因抛出错误,我如何让我的异常在它中断之前再次运行相同的函数 3 次?
只是在这里补充一下,任何函数都可能会抛出错误(不仅仅是 main2()),而且我可能不仅有 3 个函数,还有更多函数
import numpy as np
def main():
np.load('File.csv')
def main1():
np.load('File1.csv')
def main2():
np.load('File2.csv')
for i in range(1, 10):
try:
main()
main2()
main3()
except Exception as e:
print e
else:
break
Run Code Online (Sandbox Code Playgroud)