C# 例外情况并没有出现

C# 例外情况并没有出现,c#,exception-handling,try-catch,C#,Exception Handling,Try Catch,我正在尝试捕获抛出的异常,但它不会冒泡到调用它的位置。它在InsertNewUser的catch块中中断,说 “PeakPOS.exe中发生了类型为'System.exception'的异常,但未在用户代码中处理” 如果我单击debugger Continue,它会转到一个名为App.g.I.cs的文件,并在我不理解的一行中断,但与中断时调试有关。应用程序在此之后终止 为什么说当异常被重新捕获并处理(待处理)时,它没有被处理 AccessViewModel.cs public void Sav

我正在尝试捕获抛出的异常,但它不会冒泡到调用它的位置。它在InsertNewUser的catch块中中断,说

“PeakPOS.exe中发生了类型为'System.exception'的异常,但未在用户代码中处理”

如果我单击debugger Continue,它会转到一个名为
App.g.I.cs
的文件,并在我不理解的一行中断,但与中断时调试有关。应用程序在此之后终止

为什么说当异常被重新捕获并处理(待处理)时,它没有被处理


AccessViewModel.cs

public void SaveNewUser(Popup popup)
{
    UserAccounts.Add(TempUser);

    string salt = PeakCrypto.GenerateSalt();
    string hash = PeakCrypto.GenerateHashedPassword(Password + salt);
    try
    {
        PeakDB.InsertNewUser(TempUser, salt, hash);
    }
    catch (Exception e)
    {
        //TODO notify user that new account could not be saved
    }

    CreateNewAccount();

    if (popup != null)
        popup.IsOpen = false;
}
public static async void InsertNewUser(UserAccount user, String salt, String hash)
{
    var db = await DatabaseHelper.GetDatabaseAsync();

    try
    {
        using (var userStatement = await db.PrepareStatementAsync(
            "INSERT INTO AccessAccounts (FirstName, LastName, Salt, Hash) VALUES(@first, @last, @salt, @hash)"))
        {
            userStatement.BindTextParameterWithName("@first", user.FirstName);
            userStatement.BindTextParameterWithName("@last", user.LastName);
            userStatement.BindTextParameterWithName("@salt", salt);
            userStatement.BindTextParameterWithName("@hash", hash);
            await userStatement.StepAsync();
        }
    }
    catch(Exception e)
    {
        // TODO: log the exception error
        throw;
    }
}
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
    UnhandledException += (sender, e) =>
    {
        if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
    };
#endif
PeakDB.cs

public void SaveNewUser(Popup popup)
{
    UserAccounts.Add(TempUser);

    string salt = PeakCrypto.GenerateSalt();
    string hash = PeakCrypto.GenerateHashedPassword(Password + salt);
    try
    {
        PeakDB.InsertNewUser(TempUser, salt, hash);
    }
    catch (Exception e)
    {
        //TODO notify user that new account could not be saved
    }

    CreateNewAccount();

    if (popup != null)
        popup.IsOpen = false;
}
public static async void InsertNewUser(UserAccount user, String salt, String hash)
{
    var db = await DatabaseHelper.GetDatabaseAsync();

    try
    {
        using (var userStatement = await db.PrepareStatementAsync(
            "INSERT INTO AccessAccounts (FirstName, LastName, Salt, Hash) VALUES(@first, @last, @salt, @hash)"))
        {
            userStatement.BindTextParameterWithName("@first", user.FirstName);
            userStatement.BindTextParameterWithName("@last", user.LastName);
            userStatement.BindTextParameterWithName("@salt", salt);
            userStatement.BindTextParameterWithName("@hash", hash);
            await userStatement.StepAsync();
        }
    }
    catch(Exception e)
    {
        // TODO: log the exception error
        throw;
    }
}
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
    UnhandledException += (sender, e) =>
    {
        if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
    };
#endif
应用程序g.i.cs

public void SaveNewUser(Popup popup)
{
    UserAccounts.Add(TempUser);

    string salt = PeakCrypto.GenerateSalt();
    string hash = PeakCrypto.GenerateHashedPassword(Password + salt);
    try
    {
        PeakDB.InsertNewUser(TempUser, salt, hash);
    }
    catch (Exception e)
    {
        //TODO notify user that new account could not be saved
    }

    CreateNewAccount();

    if (popup != null)
        popup.IsOpen = false;
}
public static async void InsertNewUser(UserAccount user, String salt, String hash)
{
    var db = await DatabaseHelper.GetDatabaseAsync();

    try
    {
        using (var userStatement = await db.PrepareStatementAsync(
            "INSERT INTO AccessAccounts (FirstName, LastName, Salt, Hash) VALUES(@first, @last, @salt, @hash)"))
        {
            userStatement.BindTextParameterWithName("@first", user.FirstName);
            userStatement.BindTextParameterWithName("@last", user.LastName);
            userStatement.BindTextParameterWithName("@salt", salt);
            userStatement.BindTextParameterWithName("@hash", hash);
            await userStatement.StepAsync();
        }
    }
    catch(Exception e)
    {
        // TODO: log the exception error
        throw;
    }
}
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
    UnhandledException += (sender, e) =>
    {
        if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
    };
#endif

这是
async
操作的预期行为。您的代码处理/捕获从方法的同步部分抛出的异常,但允许应用程序范围的句柄处理异步部分

若在
InsertNewUser
方法(同步部分)的第一行显式抛出异常,则可以观察到预期的行为

修复:正确地
wait
您的
async
方法

// must return at least `Task` to be awaitable
public static async Task InsertNewUser(...
而不是等待方法(注意“async是病毒性的”):

或者至少
.Wait
如果它是控制台应用程序(WPF/WinForm/Asp.Net将死锁-):

如果两者都做不到,至少使用property调用
async void
方法


注意:
async void
是一种不好的做法,应该只用于表单事件。

我遇到了异常挂起的问题,但这是因为我使用wait从web服务调用web服务。我的解决办法是申请

.ConfigureAwait(continueOnCapturedContext: false)

。。。在我的内部web服务调用中。现在,当内部web服务生成异常时,我收到了预期的异常。

您是否尝试取消选中复选框,在出现异常时显示“中断”,然后再次运行?我认为在调试模式下,它会在exception@Saagar:是的。发生的情况是,它进入App.g.i.cs文件并在if语句上中断,就像以前一样,它不再中断catch。我不知道我是不是误解了你的想法。捕获异常不处理它吗?谢谢,Alexei。成功了。感谢您的链接,因为我是C#新手,只简要浏览了async/await特性,不太了解它。@ShrimpCrackers欢迎您。如果您需要使用
async
/
wait
,我强烈建议您在进行该领域的任何严肃工作之前,先浏览一下前面的答案。