C#:python try/catch/else块的等价物

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.该怎么办?

谢谢

Mar*_*ers 9

我更希望看到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)

但是,如果你这样做,我会问你为什么不从异常中完全恢复,以便你可以继续,好像已经成功,或者通过返回错误代码完全中止,甚至只是让异常传播给来电者.


Dan*_*wby 7

野蛮的解决方案:创建一个从Exception派生的Else类,在try块的末尾抛出它的一个实例,并用它catch (Else) {...}来处理其他东西.

我觉得很脏

  • 我不知道该怎么做 - 这*要求*一票-1,但我很开心,犹豫不决. (4认同)
  • 另外在python中没有捕获所有其他异常.否则,只有在没有例外的情况下才会运行. (2认同)

Vin*_*jip 0

你可以这样做:

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)