在C#中,我可以使用该throw;语句在保留堆栈跟踪的同时重新抛出异常:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Run Code Online (Sandbox Code Playgroud)
在Java中有这样的东西(不会丢失原始堆栈跟踪)吗?
我通过反射调用一种可能导致异常的方法.如何在没有包装器反射的情况下将异常传递给调用者?
我正在重新抛出InnerException,但这会破坏堆栈跟踪.
示例代码:
public void test1()
{
// Throw an exception for testing purposes
throw new ArgumentException("test1");
}
void test2()
{
try
{
MethodInfo mi = typeof(Program).GetMethod("test1");
mi.Invoke(this, null);
}
catch (TargetInvocationException tiex)
{
// Throw the new exception
throw tiex.InnerException;
}
}
Run Code Online (Sandbox Code Playgroud) 免责声明:众所周知,这catch (ex) { throw ex; } 是不好的做法.这个问题与此无关.
在挖掘Microsoft参考资源的同时,我在很多方法中都注意到了以下模式:
try {
...
} catch {
throw;
}
Run Code Online (Sandbox Code Playgroud)
没有记录,没有调试代码 - 只是一个简单的简单catch { throw; }.
显然,微软的人员应该相当熟练使用C#,这样做的重点是什么,而不是仅仅省略catch块(和try语句)?这样的编码有技术原因,还是纯粹的风格选择?
注意:我不知道它是否相关,但我能找到的所有这些实例也包含一个try-finally嵌套在块try子句中的try-catch块.
我想知道将异常从一种方法传递给另一种方法的正确方法是什么.
我正在开发一个分为Presentation(web),Business和Logic层的项目,并且需要在链中传递错误(例如SqlExceptions)以在出现问题时通知Web层.
我见过3种基本方法:
try
{
//error code
}
catch (Exception ex)
{
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
(只是重新抛出)
try
{
//error code
}
catch (Exception ex)
{
throw new MyCustomException();
}
Run Code Online (Sandbox Code Playgroud)
(抛出自定义异常,以便不传递对数据提供程序的依赖关系)
然后简单地说
//error code
Run Code Online (Sandbox Code Playgroud)
(根本不做任何事情,让错误自己冒出来)
当然,catch块中也会发生一些日志记录.
我更喜欢3号,而我的同事使用方法1,但我们都不能真正激励为什么.
使用每种方法有哪些优点/缺点?有一种我不知道的更好的方法吗?有没有被接受的最佳方式?
假设我在两个不同的程序集中有以下两个类:
//in assembly A
public class TypeA {
// Constructor omitted
public void MethodA
{
try {
//do something
}
catch {
throw;
}
}
}
//in assembly B
public class TypeB {
public void MethodB
{
try {
TypeA a = new TypeA();
a.MethodA();
}
catch (Exception e)
//Handle exception
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,MethodA中的try-catch只是提升异常,但并没有真正处理它.在MethodA中使用try-catch是否有任何优势?换句话说,这种try-catch块之间是否存在差异,而根本不使用它?
我目前正在使用具有通用存储库和工作单元模式的实体框架.我的模型类似于本文中描述的模型
我过去曾使用Generic Repositories,并且非常享受它可以提供的全局功能.但是,在将它与Entity Framework一起使用时,似乎每天都会遇到更多问题.在处理父/子/交汇关系时,这些问题似乎更多.
使用带有EF的通用存储库开始在我的口中留下不好的味道,我开始认为使用带有EF的通用存储库是错误的方法.
有人可以帮助引导我朝正确的方向发展吗?
我有尝试类型转换的代码.如果失败,我想尝试别的东西,如果失败,则重新抛出第一次转换尝试的原始异常.问题是,我知道要重新抛出的唯一方法就是throw;"坐在拦截块的末端".当我只希望从另一个catch块中发生重新抛出时会发生什么?
try
{
valueFromData = Convert.ChangeType(valueFromData, pi.PropertyType);
}
catch(InvalidCastException e)
{
Debug.WriteLine(String.Concat("Info - Direct conversion failed. Attempting to convert using String as an intermidiate type."));
try { valueFromData = Convert.ChangeType(valueFromData.ToString(), pi.PropertyType); }
catch { throw e; }
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我必须使用' throw e;',它会重置调用堆栈.
到目前为止我唯一的解决方法是(imo)粗略:
bool handled = true;
...
catch { handled = false; }
if( !handled ) throw;
Run Code Online (Sandbox Code Playgroud) 鉴于吃异常总是糟糕的juju和重新抛出异常会丢失调用堆栈,重新考虑以下因素的正确方法是什么?
吃异常:
try
{
… do something meaningful
}
catch(SomeException ex)
{
// eat exception
}
Run Code Online (Sandbox Code Playgroud) 我使用NLog在我的操作中记录错误以存储包含其他信息的错误,例如:
using NLog;
private static Logger _logger = LogManager.GetCurrentClassLogger();
public virtual ActionResult Edit(Client client)
{
try
{
// FORCE ERROR
var x = 0;
x /= x;
return RedirectToAction(MVC.Client.Index());
}
catch (Exception e)
{
_logger.Error("[Error in ClientController.Edit - id: " + client.Id + " - Error: " + e.Message + "]");
}
}
Run Code Online (Sandbox Code Playgroud)
我在Web.config中配置了错误处理:
<customErrors mode="On" />
Run Code Online (Sandbox Code Playgroud)
但是当我执行Action(页面保留在同一个地方)时,我没有被重定向到Error.cshtml,为什么?
我可以用Elmah做同样的事情吗?(记录客户端ID等附加信息)
此代码在 Visual Studio 2019 中生成信息消息:*严重性代码描述项目文件行抑制状态抑制状态详细描述消息 IDE0059
将值不必要地分配给“i”
避免在您的代码中进行不必要的赋值,因为这些可能表示冗余值计算。如果值计算不是多余的并且您打算保留赋值,则将赋值目标更改为名称以下划线开头并可选后跟整数的局部变量,例如“_”、“_1”、“_2” ' 等。这些被视为特殊的丢弃符号名称。*
代码片段工作正常,这是消息 IDE0059,让我烦恼。如果可能的话,我不想压制它。
private static XmlDocument LoadXmlFromFile(string xmlPath)
{
XmlDocument doc = new XmlDocument();
int i = 2;
while (true)
{
try
{
using (Stream fileStream = System.IO.File.Open(xmlPath, FileMode.Open, FileAccess.Read, FileShare.None))
{
doc.Load(fileStream);
}
return doc;
}
catch (IOException) when (i > 0)
{
i--;
Thread.Sleep(100);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?是误报还是我错过了什么?
此代码还在 VS2019 中产生警告 IDE0059:
private static XmlDocument LoadXmlFromFile(string xmlPath)
{
XmlDocument doc = new XmlDocument();
int i = 2;
while (true) …Run Code Online (Sandbox Code Playgroud) c# ×9
exception ×4
.net ×1
asp.net-mvc ×1
elmah ×1
generics ×1
java ×1
nlog ×1
try-catch ×1
unit-of-work ×1