C# “之间的区别”;扔;关键字和“之间写入的代码”的用法;捕获;花括号 一般来说,我们什么时候可以使用“throw”关键字 我无法区分在“catch”花括号和“throw”之间编写的代码的用法

C# “之间的区别”;扔;关键字和“之间写入的代码”的用法;捕获;花括号 一般来说,我们什么时候可以使用“throw”关键字 我无法区分在“catch”花括号和“throw”之间编写的代码的用法,c#,C#,有人能用下面的例子给我解释一下吗 使用系统; 名称空间控制台EAPP1 { 类RethrowDemo { 静态void Main(字符串[]参数) { 尝试 { WriteLine(“在main()方法中尝试”); 方法a(); } 捕获(异常ae) { WriteLine(“捕获到main()方法--\n{0}”,ae.Message); } WriteLine(“Main()方法完成”); } 私有静态void MethodA() { 尝试 { Console.WriteLine(“尝试方

有人能用下面的例子给我解释一下吗

使用系统;
名称空间控制台EAPP1
{ 
类RethrowDemo
{
静态void Main(字符串[]参数)
{
尝试
{
WriteLine(“在main()方法中尝试”);
方法a();
}
捕获(异常ae)
{
WriteLine(“捕获到main()方法--\n{0}”,ae.Message);
}
WriteLine(“Main()方法完成”);
}
私有静态void MethodA()
{
尝试
{
Console.WriteLine(“尝试方法A”);
方法b();
}
捕获(例外)
{
Console.WriteLine(“方法A中捕获”);
投掷;
}
}
私有静态void方法b()
{
尝试
{
Console.WriteLine(“尝试方法B”);
方法c();
}
捕获(例外)
{
Console.WriteLine(“在方法B中捕获”);
投掷;
}
}
私有静态void方法c()
{
控制台写入线(“在方法C中”);
抛出(新异常(“它来自方法C”);
}
}
}

当您想要手动抛出异常时,将使用throw关键字。通常在处理文件或连接到主机等时使用try-catch块。当您的代码可能会遇到类似文件不存在或类似的异常时,您会将代码放入catch{}中,如果引发异常,将执行catch{}

我将在这里添加我的答案,类似于我在评论部分中所写的内容,感谢您对500-内部服务器错误(伟大的用户名btw)提供额外的上下文

throw
by-itself关键字将保留在它之前抛出的异常,因此您将保留原始堆栈跟踪。使用
thrownew
将创建一个新的异常,该异常将删除旧的堆栈跟踪,除非您使用前面提到的构造函数

正如Zoltan提到的,try-catch块的使用是在文件读取、连接、api调用等情况下使用的。在这些情况下,catch块用于防止硬系统崩溃,并允许您执行一些工作。也许您想传播错误(因此使用throw关键字),或者您只想吞下它并将其记录到其他地方


也就是说,就我目前所知,
throw
throw new

之间的最大区别在于考虑以下代码

使用系统;
公共课程
{
公共静态void Main()
{
试一试{
方法2();
}捕获(例外e){
控制台写入线(e);
}
}
静态void方法1(){
抛出新的InvalidProgrameException(“异常1”);
}
静态void方法2(){
试一试{
方法1();
}捕获(无效程序异常e){
Console.WriteLine(“我是method2.我很坏”);
投掷;
}
}
}
如果要手动抛出异常,则可以使用
throw
关键字。考虑<代码>方法1>代码>。在
method1
中,我抛出了一个
InvlidProgramException

现在考虑<代码>方法2>代码>。如果我们只使用

throw
关键字,那么我们称之为
rethrow
。它将抛出
catch
块捕获的错误

如果catch块捕获到任何异常,将执行
catch
块内的代码。在
method2
中,当它捕获异常时,首先打印
I am method2。我是坏的
,然后抛出由
catch
捕获的错误,在本例中为
invalidProgrammeException


因为我在main方法
catch
块中使用了
Exception
,所以它可以捕获任何类型的异常。否则,
catch
只能捕获指定类型的异常,如
method2
catch块,只能捕获
invalidProgrammeException

1。当您想抛出异常时。。。2.它捕获一个异常,然后重新引用该异常。如果我没有记错,我相信throw也会保留原始异常的堆栈跟踪,而如果您决定使用throw new关键字,则会丢失上一个堆栈trace@SomeStudent:当您在此处使用“裸”
throw
语句,保留原始调用堆栈。只有在抛出新异常时,调用堆栈才会丢失,但在这种情况下,新异常的构造函数允许传入旧异常,从而保留上下文其中
ex
是在
catch
中捕获的异常。如果我没记错的话,这将在向堆栈添加异常时保留堆栈跟踪。