C# 我怎么能放弃一个例外
如何处理预期的异常 我的MVC控制器中有调用以下内容的代码: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
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;
}