C# 我怎么能放弃一个例外

C# 我怎么能放弃一个例外,c#,C#,如何处理预期的异常 我的MVC控制器中有调用以下内容的代码: u.RowKey == new SimplerAES().Dec(HttpServerUtility.UrlTokenDecode(id))); 在我的其他SimplerAES类中: public string Dec(byte[] encrypted) { return encoder.GetString(Decrypt(encrypted)); } public byte[] D

如何处理预期的异常

我的MVC控制器中有调用以下内容的代码:

u.RowKey == new SimplerAES().Dec(HttpServerUtility.UrlTokenDecode(id)));
在我的其他SimplerAES类中:

    public string Dec(byte[] encrypted)
    {
        return encoder.GetString(Decrypt(encrypted));
    }

    public byte[] Decrypt(byte[] buffer)
    {
        try {
            MemoryStream decryptStream = new MemoryStream();
            using (CryptoStream cs = new CryptoStream(decryptStream, decryptor, CryptoStreamMode.Write))
            {
                cs.Write(buffer, 0, buffer.Length);
            }
            return decryptStream.ToArray();
        } catch(CryptographicException e){
            //... do something with it ...
            return null; // I put the return null here as I got a syntax message saying
                         // not all code returns
        }
    }
有人能解释一下我是如何得到解密失败的消息的吗 到了我第一次尝试获取RowKey的时候。我必须把u.RowKey放进去吗
还有一个try-catch?

就是不要在方法中捕获异常,除非您真的需要“做点什么”部分。如果您没有捕获异常,它将在堆栈中冒泡,直到有代码捕获它

如果确实需要在该方法中执行某些操作,例如日志记录,则可以捕获异常并使用

throw;
请注意,这是首选的

throw e;
因为后者将重写堆栈跟踪。在这种特殊情况下,这可能不会有太大区别,但值得注意


我建议您暂时忽略密码学,去寻找关于C#中异常处理的好文章或书籍。这可能是一个很好的起点。

假设您确实需要在此级别执行某些操作,只需重新显示异常:

catch (CrypotgraphicException e)
{
    // Do something
    throw;
}

但是,可能更简单的方法是根本不捕获它,让它冒泡到其他异常处理程序的更高位置。

如果要继续让异常展开堆栈,请不要
从catch块返回null
。您需要
抛出
(无异常引用)以继续使用相同的异常解卷

e、 g

如果
抛出e
(其中包含现有的异常对象),则会破坏一些堆栈跟踪数据,这会降低它的有用性。如果要添加更多信息,请将现有异常包装到新异常中(作为
InnerException
),然后抛出新异常对象。这样可以保留完整的异常信息

try
{
    // Do stuff
}
catch(CryptographicException e)
{
    // Do stuff to clean up
    Exception newEx = new Exception("Some further message", e);
    throw newEx;
}

注意:不要简单地创建基本异常对象,您应该从现有的基础派生一个新的异常类(如果没有合适的异常类),并使用派生版本。这使得捕获变得更加容易,因为这样您就可以捕获所需的确切类型,而不必让catch块知道您要做什么,因为您抛出的异常过于广泛。

只有曾经捕获异常,如果您可以使用它做一些有用的事情。在解密方法中简单地将其吞并为返回null是没有用的。相反,让异常冒泡,直到它达到可以有效处理它的点

我一定要把u.RowKey放进去试试吗 你也钓到了吗

这将是一个更适合捕捉异常的地方

try
{
    // Do stuff
}
catch(CryptographicException e)
{
    // Do stuff to clean up
    Exception newEx = new Exception("Some further message", e);
    throw newEx;
}