gpt4 book ai didi

c# - 在属性中的 Set 操作期间抛出的异常未被捕获

转载 作者:行者123 更新时间:2023-11-30 12:12:54 24 4
gpt4 key购买 nike

当我尝试在属性的 Set 子句中运行一个函数时,我的全局异常处理程序永远不会捕获可能出现的任何异常。我不明白为什么会这样。这是我的代码(3 部分)

主窗口.xaml.cs

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel_();
}
}

public class ViewModel_ : INotifyPropertyChanged
{
public ViewModel_()
{
}

public string Texting
{
get { return _Texting; }
set
{
_Texting = value;
OnPropertyChanged("Texting");
throw new Exception("BAM!");
}
}
private string _Texting;


public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}

主窗口.xaml

<Window x:Class="TestExceptionHandling.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Text="{Binding Path=Texting,
UpdateSourceTrigger=PropertyChanged}" />
</Grid>

App.xaml.cs(全局异常处理程序所在的位置)

public partial class App : Application
{
public App()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show("SOMETHING IS WRONG!");
}
}

最佳答案

正如 Bob Horn 所说,如果绑定(bind)属性来自目标元素 (TextBox),即来自您的 View ,则它们不会爆炸。查看您的输出窗口,您将看到类似这样的消息 -

A first chance exception of type 'System.Exception' occurred in WpfApplication4.exe
An exception of type 'System.Exception' occurred in WpfApplication4.exe but was not handled in user code
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=Name; DataItem='VM' (HashCode=28331431); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') Exception:'System.Exception: BAM!

但是,尝试从 ViewModel 的构造函数中设置相同的属性,应用程序肯定会崩溃。

作为旁注,这对所有异常都无效,请尝试这样做 -

public string Texting
{
get { return _Texting; }
set
{
_Texting = value;
OnPropertyChanged("Texting");
throw new StackOverflowException("BAM!");
}
}

这肯定会被您的全局异常处理程序捕获,因为应用程序无法在 StackOverflow 模式下运行。

关于c# - 在属性中的 Set 操作期间抛出的异常未被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12658220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com