I am using the MVVM pattern for a WPF application. In several places I bind commands to input elements in the views as in the following XAML:
<Button Command="{Binding TheClickCommand}" >Click</>
What is the best practice for handling exceptions thrown when the command is executed in my viewmodel - i.e. what is the best way to inform the view that something is wrong? Can I use the IDataErrorInfo pattern or is there some other built-in pattern for this scenario?
Start by creating a new WPF project with the name WPFExceptionHandling. Drag one textbox from the toolbox to the design window. The following XAML code creates a textbox and initializes it with some properties. Here is the file reading with exception handling in C#.
The short answer is NO. You would throw an exception if the application can't continue executing with the bad data. In your example, the logic is to display an error message on the front end and Option 2 is the cleaner method for achieving this requirement.
Use exceptions when the code that handles the error is separated from the code that detects the error by one or more intervening function calls. Consider whether to use error codes instead in performance-critical loops, when code that handles the error is tightly coupled to the code that detects it.
I hate this answer, but it really depends on a context.
Today I may use IoC, to get ILoggerService or INotificationSerivce or both and do the stuff when something went wrong. Tomorrow I may be happy with raw MessageBox.Show() somewhere in the DispatcherUnhandledException event handler. Or maybe I will write my own attached property ala
<Button loc:Commanding.ExceptionAwareCommand="{loc:CommandExtension
Command={Binding TheClickCommand},
FallBackCammand={Binding ErrorHandlerCommand}}" />
and live with it...
Probably the answer may go like this: "Choose the best method to communicate between two classes and use it". Sorry for being non concrete... Maybe somebody else will be more specific.
NB: Interfaces' names, provided in the answer are not WPF standard. I use them just as an example.
Cheers
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With