Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. uncaught exception handlers

uncaught exception handlers

Scheduled Pinned Locked Moved C#
tutorialquestionlearning
73 Posts 8 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G George_George

    Thanks Derek, So, "massive improvement" you mean performance improvements? regards, George

    D Offline
    D Offline
    Derek Bartram
    wrote on last edited by
    #64

    Yes. Although perhaps also in terms of code style.

    G 1 Reply Last reply
    0
    • G George_George

      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

      N Offline
      N Offline
      N a v a n e e t h
      wrote on last edited by
      #65

      George_George wrote:

      So, asynchronous function call is the only case when we can catch exception from another thread?

      George, we are not able to catch exceptions happening on another thread. In this case also it's not happening. We are catching exception in the asynchronous method it self and keeping it for future use. When end method is called, this exception will be thrown out. Have a look at the following code

      Exception raisedException = null; // This is accessible in the whole class
      void BeginRead()
      {
      try{
      //Do some asynchronous process
      }
      cath(Exception ex){
      raisedException = ex;
      }
      }
      void EndRead()
      {
      // Do something to stop asynchronous processing. You will call WaitHandle.WaitOne() here.
      if(raisedException != null) throw raisedException; //We are throwing the exception occured

      // No exceptions. So return the result
      

      }

      In the above code, we have handled the exception and threw it when end is called. Note we handled the exception in the same thread where asynchronous method is executing, not in the main thread. Hope things are clear now.

      All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

      G 1 Reply Last reply
      0
      • D Derek Bartram

        Yes. Although perhaps also in terms of code style.

        G Offline
        G Offline
        George_George
        wrote on last edited by
        #66

        Thanks Derek, It is clear now. Sorry for my bad English. :-) regards, George

        D 1 Reply Last reply
        0
        • G George_George

          Thanks Derek, It is clear now. Sorry for my bad English. :-) regards, George

          D Offline
          D Offline
          Derek Bartram
          wrote on last edited by
          #67

          No problem. Your english is VERY good, certainly better than my other languages :)

          G 1 Reply Last reply
          0
          • N N a v a n e e t h

            George_George wrote:

            So, asynchronous function call is the only case when we can catch exception from another thread?

            George, we are not able to catch exceptions happening on another thread. In this case also it's not happening. We are catching exception in the asynchronous method it self and keeping it for future use. When end method is called, this exception will be thrown out. Have a look at the following code

            Exception raisedException = null; // This is accessible in the whole class
            void BeginRead()
            {
            try{
            //Do some asynchronous process
            }
            cath(Exception ex){
            raisedException = ex;
            }
            }
            void EndRead()
            {
            // Do something to stop asynchronous processing. You will call WaitHandle.WaitOne() here.
            if(raisedException != null) throw raisedException; //We are throwing the exception occured

            // No exceptions. So return the result
            

            }

            In the above code, we have handled the exception and threw it when end is called. Note we handled the exception in the same thread where asynchronous method is executing, not in the main thread. Hope things are clear now.

            All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

            G Offline
            G Offline
            George_George
            wrote on last edited by
            #68

            Thanks N a v a n e e t h, I agree with all of your points, except this one,

            N a v a n e e t h wrote:

            Note we handled the exception in the same thread where asynchronous method is executing, not in the main thread.

            My point is we should handle it in main thread. Here is my code to prove. Any comments? (sorry the code is a little messy, I used it to test for multi-purpose in this discussion.)

            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();
            */

                    // ThreadPool.QueueUserWorkItem(new WaitCallback(Test.Method2));
            
                    
                    Console.WriteLine("We will use a Delegate now");
                    Method1Delegate dlg = new Method1Delegate(Method1);
                    IAsyncResult handle = dlg.BeginInvoke(null, null);
                    
                    Thread.Sleep(1000);
            
                    Console.WriteLine("Was the exception reported so far?");
            
                    try
                    {
                        Console.WriteLine("Let's call EndInvoke");
                        dlg.EndInvoke(handle);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Exception: {0}", ex.Message);
                    }
                        
            
            
                    Thread.Sleep(5000);
            
                    Console.WriteLine("Survived exception");
            
                    return;
            
            N 1 Reply Last reply
            0
            • D Derek Bartram

              No problem. Your english is VERY good, certainly better than my other languages :)

              G Offline
              G Offline
              George_George
              wrote on last edited by
              #69

              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

              1 Reply Last reply
              0
              • G George_George

                Thanks N a v a n e e t h, I agree with all of your points, except this one,

                N a v a n e e t h wrote:

                Note we handled the exception in the same thread where asynchronous method is executing, not in the main thread.

                My point is we should handle it in main thread. Here is my code to prove. Any comments? (sorry the code is a little messy, I used it to test for multi-purpose in this discussion.)

                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();
                */

                        // ThreadPool.QueueUserWorkItem(new WaitCallback(Test.Method2));
                
                        
                        Console.WriteLine("We will use a Delegate now");
                        Method1Delegate dlg = new Method1Delegate(Method1);
                        IAsyncResult handle = dlg.BeginInvoke(null, null);
                        
                        Thread.Sleep(1000);
                
                        Console.WriteLine("Was the exception reported so far?");
                
                        try
                        {
                            Console.WriteLine("Let's call EndInvoke");
                            dlg.EndInvoke(handle);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Exception: {0}", ex.Message);
                        }
                            
                
                
                        Thread.Sleep(5000);
                
                        Console.WriteLine("Survived exception");
                
                        return;
                
                N Offline
                N Offline
                N a v a n e e t h
                wrote on last edited by
                #70

                George_George wrote:

                My point is we should handle it in main thread. Here is my code to prove. Any comments?

                Your code is working perfectly. I guess you tried it by running the application in debug mode - Right ? When application runs on debug mode, VS editor will break when exception occurs and points to the suspected line. You should try running this without in debug mode (Ctrl + F5). You can see it executes correctly. Exception will be caught when EndInvoke() get called.

                All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                G 1 Reply Last reply
                0
                • N N a v a n e e t h

                  George_George wrote:

                  My point is we should handle it in main thread. Here is my code to prove. Any comments?

                  Your code is working perfectly. I guess you tried it by running the application in debug mode - Right ? When application runs on debug mode, VS editor will break when exception occurs and points to the suspected line. You should try running this without in debug mode (Ctrl + F5). You can see it executes correctly. Exception will be caught when EndInvoke() get called.

                  All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                  G Offline
                  G Offline
                  George_George
                  wrote on last edited by
                  #71

                  Thanks for your review, N a v a n e e t h! It is clear now. regards, George

                  1 Reply Last reply
                  0
                  • G George_George

                    Thanks Spacix, What do you mean "using exceptions to contol logic"? We should never throw any exception when there is some logical errors during runtime? regards, George

                    S Offline
                    S Offline
                    Spacix One
                    wrote on last edited by
                    #72

                    Like in my second code block, if you throw in your method and you catch it to only return something less complex, or change your structure. Hmm better example: (This is an intentional BAD code example!)

                        static FileStream openFile(string filePath)
                        {
                            FileStream fs;
                            try
                            {
                                fs = File.OpenRead(filePath);
                            }
                            catch (FileNotFoundException err)
                            {
                                File.Create(filePath);
                                fs = File.OpenRead(filePath);
                            }
                            return fs;
                        }
                    

                    That is bad because you could just used File.Exist() to check for the file before opening it, and make it before trying to call OpenRead() on it. I know this is pointless but still an example of a NEVER do...


                    -Spacix All your skynet questions[^] belong to solved


                    I dislike the black-and-white voting system on questions/answers. X|


                    G 1 Reply Last reply
                    0
                    • S Spacix One

                      Like in my second code block, if you throw in your method and you catch it to only return something less complex, or change your structure. Hmm better example: (This is an intentional BAD code example!)

                          static FileStream openFile(string filePath)
                          {
                              FileStream fs;
                              try
                              {
                                  fs = File.OpenRead(filePath);
                              }
                              catch (FileNotFoundException err)
                              {
                                  File.Create(filePath);
                                  fs = File.OpenRead(filePath);
                              }
                              return fs;
                          }
                      

                      That is bad because you could just used File.Exist() to check for the file before opening it, and make it before trying to call OpenRead() on it. I know this is pointless but still an example of a NEVER do...


                      -Spacix All your skynet questions[^] belong to solved


                      I dislike the black-and-white voting system on questions/answers. X|


                      G Offline
                      G Offline
                      George_George
                      wrote on last edited by
                      #73

                      Thanks for your clarification, Spacix! regards, George

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups