在C#中,函数中使用异常的时候,try中的return可以返回,但是在catch中的return返回啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中,函数中使用异常的时候,try中的return可以返回,但是在catch中的return返回啥?相关的知识,希望对你有一定的参考价值。

static void Main(string[] args)

int i1 = MyInt("一");
int i2 = MyInt("二");
Console.WriteLine("0与1的和是2!",i1,i2,i1+i2);
Console.ReadKey();

static int MyInt(string s)

try

Console.WriteLine("请输入第0个整数。", s);
string input = Console.ReadLine();
int i = Convert.ToInt32(input);
return i;

catch(Exception ex)

Console.WriteLine("0", ex.Message);
int i = 0;//问题在这里……
return i;//如果不写return的话,会说函数MyInt并非所有的代码路径都返回值


想知道catch中的return返回什么……
在catch中返回了int变量i后,怎么让Main中的Console.WriteLine不执行啊……

catch中的return是指:

在try 。。。 代码块中,如果抛出异常, 则会进入 catch ... ,如果没有抛出异常,代码不会执行catch ... 。就像是代码执行流程的两个分支。

另外,C#编译器要求所有函数所有的分支必须返回值,正如代码中注释所说的:“;//如果不写return的话,会说函数MyInt并非所有的代码路径都返回值


补充:

catch表示捕获了异常,或者说“消化”了异常,即我们以代码的方式消除了这个异常。所以程序还是会继续执行。执行完:

int i1 = MyInt("一");
int i2 = MyInt("二");
两句后,会正常执行:
Console.WriteLine("0与1的和是2!",i1,i2,i1+i2);
参考技术A 返回一个表示错误的值,比如-1,自己明白就行了

对啊,在WriteLine()之前加一个判断,
如果是表示错误的值,就不要写了啊。本回答被提问者采纳
参考技术B 由于你的函数是INT返回类型,所以程序在编译时无论你是在catch里还是不在catch里都必须具备一个INT型的返回值,编译器可不会理会在不在catch里,它只知道它要一个返回值

C#多线程开发-处理异步操作中的异常

C#多线程开发-处理子线程中的异常

在平时的多线程开发中,对于异常的处理是至关重要的,千万不能马虎。如果在实际的项目中,对于某些线程中的异常没有处理,会直接导致整个程序崩溃,软件无法使用。

其中需要说明的是,在子线程中产生的异常是无法在主线程被捕获到,也就是你即使在使用线程方法外有try/catch也无济于事,线程中的异常只能在线程中捕获并处理。

比如下面的例子,可以看到在创建线程的代码是在try/catch中的,按照常理来说,如果子线程中有异常发生那么外部的try/catch是可以正常收到异常通知的。

        static void Main(string[] args)
        
            try
            
                Thread tempThread = new Thread(Test); 
                tempThread.Start();
             
            catch (Exception ex)
            
                Console.WriteLine("" + ex.Message);
            
        

        private static void Test()
        
            Thread.Sleep(100);

            for (int i = 0; i < 100; i++)
            
                Console.WriteLine("" + i);
                if (i == 10)
                
                    throw new Exception("触发异常" + i);
                
            
        

运行上面的代码,可以看到程序无法在外部通过try/catch方法接收到异常,运行后软件会直接异常到子线程中,无法把异常在次往出抛。以后我们在使用线程/异步(也是一种特殊的线程)时要特别的留心。

然而正确的做法是在子线程中捕获并处理异常。把程序进行修改,下面就可以正确捕获到异常信息。

        private static void Test()
        
            Thread.Sleep(100);
            try
            
                for (int i = 0; i < 100; i++)
                
                    Console.WriteLine("" + i);
                    if (i == 10)
                    
                        throw new Exception("触发异常" + i);
                    
                
            
            catch (Exception ex)
            
                Console.WriteLine("捕获的子线程中的异常信息:"+ex.Message);
                        
        

看下面图片,程序就在子线程中捕获到了异常信息。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。

作者:阿辉
关注我:微信扫描下面二维码,关注后6T编程资料免费送。
微信公众号:Andy阿辉
写一些程序员的所思所想,希望对你有帮助。

版权声明:本文版权归作者和博客园共有,欢迎转载,
但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

以上是关于在C#中,函数中使用异常的时候,try中的return可以返回,但是在catch中的return返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

C#中关于try-catch的异常捕获问题

C#中关于try-catch的异常捕获问题

22 C#中的异常处理入门 try catch throw

C#多线程开发-处理异步操作中的异常

try,finally问题

C# try-catch