C# C try/catch块中的未捕获异常

C# C try/catch块中的未捕获异常,c#,encryption,C#,Encryption,考虑一个在内部使用加密函数的WPF应用程序: using System; using System.Security.Cryptography; using System.Windows; namespace CryptoExceptionHandling { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial clas

考虑一个在内部使用加密函数的WPF应用程序:

using System;
using System.Security.Cryptography;
using System.Windows;

namespace CryptoExceptionHandling {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            try {
                MakeCryptoException();
            } catch (CryptographicException x) {
                MessageBox.Show(x.Message);
            }
        }

        private void MakeCryptoException() {
            using (var csp = new RSACryptoServiceProvider(1024, new CspParameters { ProviderType = 1 })) {
                var data = new byte[128];
                new Random().NextBytes(data);
                csp.Decrypt(data, false);
            };

        }

    }
}
我希望这个程序会向我显示一个异常消息框。该程序模拟了一种情况,即提供给我的应用程序的某些数据被证明无效

我不希望应用程序在这里崩溃,我希望应用程序做一些更有意义的事情,比如显示拒绝访问或无效数据屏幕

如何捕获异常?通过创建一个空的WPF应用程序并将下面的代码粘贴为MainWindow.cs内容,您可以轻松地重新创建此案例

我删除了这个问题前面的内容,因为从评论中可以看出,它缺少一个有效的例子。

解决方案:

转到“调试”菜单的“选项”子菜单,取消选中“异常跨越AppDomain或托管/本机边界时中断”选项


我之前调试了一些混合/不安全的代码,但完成后忘记取消选中。

有些地方出错了,但我无法显示任何代码,人们可以猜测吗?由于神秘的托管/本机边界,例外情况是未知的-包含的大多数加密提供程序都是围绕本机代码的托管代码,这也是为什么它们中的大多数都是一次性实现IDisposable的原因。这就是异常的意思,托管包装器外部的本机代码中发生错误。正如其他人已经提到的,如果您需要更多有用的帮助,您必须提供额外的详细信息。什么算法,以及如何创建实例?对于对称:加密流还是直接消费?我的心灵调试最近的一次打击是你有一个ICryptoTransform,它的CanReuseTransform值为false,但你无论如何都重用了它,但这完全是基于它工作了一次,然后失败了。你需要提供一些最低限度的修改才能得到真正的帮助。对不起,这种错误。无法粘贴代码,这是最高机密。可以做简单的例子,太复杂的情况。仍然:@Igor-假设异常发生在非托管代码中-我如何使应用程序对无效数据做出反应,而不仅仅是崩溃?如果不尝试解密,就无法测试密钥和数据的正确性。1。例外!=应用程序崩溃。您可以使用catch从预期的异常中恢复,并向调用方返回所需的内容。2.如果您的应用程序依赖模糊处理来实现安全性,那么您就错了。加密、解密、散列等应依赖于现有的强大、经验证且安全的提供商。使其安全的是选定的密钥,而不是代码。如果它是真正安全的,那么代码是否共享就不重要了。