|
The point is sample two doesn't throw an exception but rather just run a different section of code. An if statement inherinatly has less overhead than that of a try...catch statement. Certainly both will perform exactly the same function however the second will run more efficiently and quicker.
|
|
|
|
|
Thanks for your clarification, Derek!
It is clear now.
regards,
George
|
|
|
|
|
Derek Bartram wrote: massive performance hit
Perhaps you haven't read this[^] yet.
|
|
|
|
|
Thanks for the link, an interesting article. I probably didn't specify 'massive' which didn't help; I meant relative to performing an if test to prevent the exception.
|
|
|
|
|
Thanks Derek,
What do you mean "didn't specify 'massive' which didn't help" and "relative to performing an if test to prevent the exception"? Could you show more description or some pseudo code about your approach please?
regards,
George
|
|
|
|
|
Firstly, from above
//writer is a stream writer to a file..
try
{
writer.Write("Hello");
}
catch (Exception err)
{
//handle error
}
In this case you couldn't test for every possible error as some are far out the scope of plausible; e.g. can't access the file as it was on a removable drive that was just unplugged.
George_George wrote:
"not controlling programming flow"?
//slider is a silder whos value is 0 to 100
double y = 100.0 / slider.Value
then
try
{
double y = 100.0 / slider.Value
}
catch (Exception)
{
//handler exception
}
is a bad way to write this code (remembing slider.Value could be 0 causing divide by 0 exception), a better way would be....
if (slider.Value != 0)
{
double y = 100.0 / slider.Value
}
else
{
handle error
}
George_George wrote: What do you mean "didn't specify 'massive' which didn't help"
It's all very well saying massive improvement or whatever, but if you don't give some quantative value or referance, massive has no meaning (it could save 0.1ms which in terms of clock cycle is alot, but probably less significant to compared to a complex if statement).
|
|
|
|
|
Thanks Derek,
So, "massive improvement" you mean performance improvements?
regards,
George
|
|
|
|
|
Yes. Although perhaps also in terms of code style.
|
|
|
|
|
Thanks Derek,
It is clear now. Sorry for my bad English.
regards,
George
|
|
|
|
|
No problem. Your english is VERY good, certainly better than my other languages
|
|
|
|
|
Thanks for your patience to help me, Derek!
I think one of the most important things for developer is to be patience to learn new things.
regards,
George
|
|
|
|
|
Thanks PIEBALDconsult,
Good reference.
regards,
George
|
|
|
|
|
Hi Spacix,
I doubt whether your approach could achieve the same effect as using Application.ThreadException or AppDomain.CurrentDomain.UnhandledException (suppose there are multple threads)? Any comments?
regards,
George
|
|
|
|
|
George_George wrote: Application.ThreadException is for Windows Form application, not console and Windows Service application?
I don't think that there is a method to do this on console applications. In windows applications, you can hook event handlers to Application.ThreadException or AppDomain.CurrentDomain.UnhandledException . But these event handlers won't be executed in all cases. If the exception is occurring before the event handler is hooked, it won't be handled. Also exceptions occurring in unmanaged resources won't be handled too.
|
|
|
|
|
Thanks N a v a n e e t h,
What do you mean "windows applications"? I have checked again in VS 2008, there is not a project type names "windows applications". Do you mean Windows Forms application?
regards,
George
|
|
|
|
|
George_George wrote: Windows Forms application?
Yes. Also you can wrap the main() method in try catch blocks. So it can handle all exceptions.
|
|
|
|
|
No, N a v a n e e t h. Not catch all exceptions, you can not catch exception from other threads? Right?
regards,
George
|
|
|
|
|
George_George wrote: you can not catch exception from other threads? Right?
Yes. You are right. I missed that. Hook AppDomain.UnhandledException which handles all exception other than the ones I specified in my first message.
|
|
|
|
|
You mean "Also exceptions occurring in unmanaged resources won't be handled too" will not be handled?
regards,
George
|
|
|
|
|
George_George wrote: "Also exceptions occurring in unmanaged resources won't be handled too"
Yes. It won't be handled. Because it runs out of CLR.
|
|
|
|
|
Thanks N a v a n e e t h,
1.
Seems UnhandledException is the only approach to handle exception from other threads, and I have tried even ProcessExit does not work. Here is my code to test. Could you review whether my code and my points are correct?
2.
After the handler for UnhandledException is executed, process is always terminated?
using System;
using System.Threading;
namespace DelegateThread
{
class Test
{
private static void Method2 (object input)
{
Console.WriteLine("Method1 is throwing exception");
throw new ApplicationException("**** oops ****");
}
private static void Method1()
{
Console.WriteLine("Method1 is throwing exception");
throw new ApplicationException("**** oops ****");
}
private static void Handler1 (object sender, EventArgs e)
{
Console.WriteLine ("I am here");
}
private static void Handler3(object sender, EventArgs e)
{
Console.WriteLine("I am here");
}
delegate void Method1Delegate();
static void Main(string[] args)
{
Console.WriteLine("We first use a thread");
AppDomain.CurrentDomain.ProcessExit += new EventHandler (Test.Handler1);
AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(Test.Handler3);
Thread aThread
= new Thread(new ThreadStart(Method1));
aThread.Start();
Thread.Sleep(5000);
Console.WriteLine("Survived exception");
return;
}
}
}
regards,
George
|
|
|
|
|
George_George wrote: and I have tried even ProcessExit
ProcessExist is not needed here
George_George wrote: After the handler for UnhandledException is executed, process is always terminated?
mm, look like you are still not clear. I will try to explain once more. AppDomain.UnhandledException is not an exception handler like catch . It's an event which will be fired before program exits due to uncaught error. After handler is executed, process will be terminated. This is a new behavior from .NET 2.0 onwards. In handler you can do necessary steps to log the error. You can't prevent application ending. In that handler you can show friendly messages to user and inform him that we are closing.
Considering all these points in mind, your demo code is working as expected. Handler is getting executed and application is closing. You need to change the handler3() method like this.
private static void Handler3(object sender, UnhandledExceptionEventArgs e)
{
Exception exceptionOccured = e.ExceptionObject as Exception;
string errorMessage = exceptionOccured.Message;
Console.WriteLine("I am here");
}
. In this you can see how exception occurred is retrieved from the event argument. You can log the exception message and application will be exited gracefully.
.NET 1.1 behavior can be taken back by setting some flag value in application.config file. See this[^]. But I don't recommend that, as I don't know the pros/cons of that.
Hope it's clear now.
|
|
|
|
|
Thanks N a v a n e e t h,
Cool! I have made further tests that, there is one exception case. When exception is from thread pool thread -- but in the situation of executing asynchronous method call, we can catch the exception (even if unhandled in the thread pool worker thread) in EndInvoke in main thread.
So, here is a case when there is unhandled exception in another thread, we can still catch it and not make process terminated.
Any comments?
regards,
George
|
|
|
|
|
George_George wrote: but in the situation of executing asynchronous method call, we can catch the exception (even if unhandled in the thread pool worker thread) in EndInvoke in main thread.
This how asynchronous methods works. It will handle exception safely and throws when end method is called.
George_George wrote: when there is unhandled exception in another thread, we can still catch it and not make process terminated.
You are always allowed to catch exceptions in the same thread. Cross-thread exception handling is only not possible. In this case also you are handling exceptions in the same thread, so there won't be any issues. Asynchronous method runs on a thread pool thread and handles exception inside that method and keep it until end is called. When end is called, it will check exception is null, if not null it will be thrown.
|
|
|
|
|
Thanks N a v a n e e t h,
So, asynchronous function call is the only case when we can catch exception from another thread?
regards,
George
|
|
|
|