相关疑难解决方法(0)

在不丢失堆栈跟踪的情况下重新使用Java中的异常

在C#中,我可以使用该throw;语句在保留堆栈跟踪的同时重新抛出异常:

try
{
   ...
}
catch (Exception e)
{
   if (e is FooException)
     throw;
}
Run Code Online (Sandbox Code Playgroud)

在Java中有这样的东西(不会丢失原始堆栈跟踪)吗?

java exception

397
推荐指数
8
解决办法
25万
查看次数

如何重新抛出InnerException而不会丢失C#中的堆栈跟踪?

我通过反射调用一种可能导致异常的方法.如何在没有包装器反射的情况下将异常传递给调用者?
我正在重新抛出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)

.net c# exception

290
推荐指数
9
解决办法
7万
查看次数

是否有任何技术原因要编写仅包含throw语句的catch块?

免责声明:众所周知,这catch (ex) { throw ex; } 是不好的做法.这个问题与此无关.


在挖掘Microsoft参考资源的同时,我在很多方法中都注意到了以下模式:

try {
    ...
} catch {
    throw;
}
Run Code Online (Sandbox Code Playgroud)

没有记录,没有调试代码 - 只是一个简单的简单catch { throw; }.

显然,微软的人员应该相当熟练使用C#,这样做的重点是什么,而不是仅仅省略catch块(和try语句)?这样的编码有技术原因,还是纯粹的风格选择?

注意:我不知道它是否相关,但我能找到的所有这些实例也包含一个try-finally嵌套在块try子句中的try-catch块.

c# exception-handling

22
推荐指数
2
解决办法
571
查看次数

传递异常的正确方法是什么?(C#)

我想知道将异常从一种方法传递给另一种方法的正确方法是什么.

我正在开发一个分为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,但我们都不能真正激励为什么.

使用每种方法有哪些优点/缺点?有一种我不知道的更好的方法吗?有没有被接受的最佳方式?

c# exception

20
推荐指数
4
解决办法
3万
查看次数

重新投掷参数少捕获和不做任何事情之间的区别?

假设我在两个不同的程序集中有以下两个类:

//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块之间是否存在差异,而根本不使用它?

c# exception try-catch

14
推荐指数
1
解决办法
3350
查看次数

我应该使用带有Entity Framework 5的通用存储库吗?

我目前正在使用具有通用存储库和工作单元模式的实体框架.我的模型类似于本文中描述的模型

我过去曾使用Generic Repositories,并且非常享受它可以提供的全局功能.但是,在将它与Entity Framework一起使用时,似乎每天都会遇到更多问题.在处理父/子/交汇关系时,这些问题似乎更多.

使用带有EF的通用存储库开始在我的口中留下不好的味道,我开始认为使用带有EF的通用存储库是错误的方法.

有人可以帮助引导我朝正确的方向发展吗?

c# generics entity-framework unit-of-work

13
推荐指数
1
解决办法
8011
查看次数

如何从嵌套的try-catch块中重新抛出先前的异常?(C#)

我有尝试类型转换的代码.如果失败,我想尝试别的东西,如果失败,则重新抛出第一次转换尝试的原始异常.问题是,我知道要重新抛出的唯一方法就是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)

c# exception-handling

12
推荐指数
1
解决办法
1566
查看次数

在c#om nom nom中吃异常

鉴于吃异常总是糟糕的juju和重新抛出异常会丢失调用堆栈,重新考虑以下因素的正确方法是什么?

吃异常:

try
{
  … do something meaningful
}
catch(SomeException ex)
{
   // eat exception
}
Run Code Online (Sandbox Code Playgroud)

c# exception-handling

10
推荐指数
3
解决办法
2593
查看次数

使用NLog处理错误并尝试捕获

我使用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等附加信息)

c# error-handling asp.net-mvc elmah nlog

8
推荐指数
1
解决办法
2048
查看次数

IDE0059 给“i”分配了不必要的值

此代码在 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# visual-studio-2019

7
推荐指数
1
解决办法
1万
查看次数