olo*_*tus 7 c# python exception try-catch
在Python中,有一个有用的异常处理代码:
try:
# Code that could raise an exception
except Exception:
# Exception handling
else:
# Code to execute if the try block DID NOT fail
Run Code Online (Sandbox Code Playgroud)
我认为能够将可能引发的代码与普通代码分开是很有用的.在Python中,这可能如上所示,但是我在C#中找不到类似的东西.
假设该特征或类似特征不存在,将标准代码放入try块中或块之后是标准做法catch吗?
我问的原因是因为我有以下代码:
if (!IsReadOnly)
{
T newobj;
try
{
newobj = DataPortal.Update<T>(this);
List<string> keys = new List<string>(BasicProperties.Keys);
foreach (string key in keys)
{
BasicProperties[key] = newobj.BasicProperties[key];
}
}
catch (DataPortalException)
{
// TODO: Implement DataPortal.Update<T>() recovery mechanism
}
}
Run Code Online (Sandbox Code Playgroud)
这需要普通代码在try块中,否则如果引发异常并随后处理,newobj则会被取消分配,但是在try块中有这么多代码并且与之无关,这感觉非常不自然DataPortalException.该怎么办?
谢谢
我更希望看到try/catch之外的其余代码,因此很清楚你试图捕获的异常来自哪里,并且你不会意外地捕获你不想捕获的异常.
我认为与Python try/catch/else最接近的是使用本地布尔变量来记住是否抛出了异常.
bool success;
try
{
foo();
success = true;
}
catch (MyException)
{
recover();
success = false;
}
if (success)
{
bar();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你这样做,我会问你为什么不从异常中完全恢复,以便你可以继续,好像已经成功,或者通过返回错误代码完全中止,甚至只是让异常传播给来电者.
野蛮的解决方案:创建一个从Exception派生的Else类,在try块的末尾抛出它的一个实例,并用它catch (Else) {...}来处理其他东西.
我觉得很脏
你可以这样做:
if (!IsReadOnly)
{
T newobj = null;
try
{
newobj = DataPortal.Update<T>(this);
}
catch (DataPortalException)
{
// TODO: Implement DataPortal.Update<T>() recovery mechanism
}
if (newobj != null)
{
List<string> keys = new List<string>(BasicProperties.Keys);
foreach (string key in keys)
{
BasicProperties[key] = newobj.BasicProperties[key];
}
}
}
Run Code Online (Sandbox Code Playgroud)