有什么区别
try { ... }
catch{ throw }
Run Code Online (Sandbox Code Playgroud)
和
try{ ... }
catch(Exception e) {throw new Exception(e.message) }
Run Code Online (Sandbox Code Playgroud)
无论第二个显示消息?
有什么区别
try { }
catch
{ throw; }
Run Code Online (Sandbox Code Playgroud)
和
try { }
catch(Exception e)
{ throw e;}
Run Code Online (Sandbox Code Playgroud)
?
什么时候应该使用其中一个?
我在C#中遇到了这个新功能,它允许在满足特定条件时执行catch处理程序.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Run Code Online (Sandbox Code Playgroud)
我想知道什么时候这可能有用.
一种情况可能是这样的:
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
Run Code Online (Sandbox Code Playgroud)
但这又是我可以在同一个处理程序中执行的操作,并根据驱动程序的类型委托给不同的方法.这是否使代码更容易理解?可以说没有.
我能想到的另一个场景是:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{ …Run Code Online (Sandbox Code Playgroud) 我一直认为"throw"和"throw ex"之间的区别在于单独抛出并没有重置异常的堆栈跟踪.
不幸的是,这不是我正在经历的行为; 这是一个复制我的问题的简单示例:
using System;
using System.Text;
namespace testthrow2
{
class Program
{
static void Main(string[] args)
{
try
{
try
{
throw new Exception("line 14");
}
catch (Exception)
{
throw; // line 18
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这段代码能够从第14行开始打印一个callstack; 然而,callstack从第18行开始.当然,它在样本中没什么大不了的,但在我的实际应用中,丢失初始错误信息是非常痛苦的.
我错过了一些明显的东西吗 有没有其他方法来实现我想要的(即重新抛出异常而不丢失堆栈信息?)
我正在使用.net 3.5
这两个代码示例是否相同?Catch and Catch(Exception e)具有相同的输出,如果我写Throw或Throw e,结果也是相同的.
主要:
try
{
A();
//B();
}
catch (Exception e)
{
Console.WriteLine("{0} exception caught.", e);
}
Run Code Online (Sandbox Code Playgroud)
代码1:
static void A()
{
try
{
int value = 1 / int.Parse("0");
}
catch (Exception e)
{
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
代码2:
static void A()
{
// Rethrow syntax.
try
{
int value = 1 / int.Parse("0");
}
catch
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 这是一个后续问题,"throw"和"throw ex"之间有区别吗?
有没有办法提取新的错误处理方法而不重置堆栈跟踪?
[编辑] 我将尝试"内部方法"和Earwicker提供的另一个答案,看看哪一个可以更好地标记答案.
我无法使用smtp客户端发送邮件.这是代码:
SmtpClient client=new SmtpClient("Host");
client.Credentials=new NetworkCredential("username", "password");
MailMessage mailMessage = new MailMessage();
mailMessage.from="sender@gmail.com";
mailMessage.To.Add("recipient@gmail.com");
mailMessage.body="body";
mailMessage.subject="subject";
client.Send(mailMessage);
Run Code Online (Sandbox Code Playgroud)
问题是,当我在ASP.NET应用程序中使用此代码时,我不会收到任何邮件.在asp.net中,我将从邮件地址更改为NetworkCredential中给出的用户名,我收到邮件.
但是在C#windows应用程序中,即使发件人的电子邮件地址无效,我也可以收到电子邮件.
C++之间的区别是什么?
try { /*some code here*/}
catch(MyException& ex)
{ throw ex;} //not just throw
Run Code Online (Sandbox Code Playgroud)
和
try { /*some code here*/}
catch(MyException& ex)
{ throw;} //not throw ex
Run Code Online (Sandbox Code Playgroud)
它只是在堆栈跟踪中(在C++中,在任何情况下都不是C#或Java中的标准)?
(如果它有任何区别,我使用MSVS 2008.)
谁能告诉我throw和throw ex简短的区别?我读过那个throw存储以前的异常,没有得到这一行.
我能举例说明这个吗?
您显然能够在不丢弃.NET中的堆栈跟踪的情况下重新抛出异常.
但它似乎没有起作用.
因此我遵循的基本用法是:
[WebMethod]
public void ExceptionTest()
{
try
{
throw new Exception("An Error Happened");
}
catch (Exception ex)
{
evlWebServiceLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,行中的行中的throw;行号,而不是原始throw new行.
我在一个简单的exe项目中测试了它,没有登录到Windows日志行.它没有任何区别,堆栈跟踪总是包含错误的行号,使其不太有用.
它为什么这样做?我该怎么做?
c# ×9
.net ×4
stack-trace ×2
throw ×2
asp.net ×1
c++ ×1
exception ×1
smtpclient ×1
try-catch ×1