Tag: exception处理

在c#中捕获特定与通用exception

这个问题来自针对我创建的对象的代码分析。 分析说我应该捕获一个比基本exception更具体的exception类型。 您是否发现自己只使用捕获通用exception或尝试捕获特定exception并使用多个catch块默认为通用exception? 有问题的代码块之一如下: internal static bool ClearFlags(string connectionString, Guid ID) { bool returnValue = false; SqlConnection dbEngine = new SqlConnection(connectionString); SqlCommand dbCmd = new SqlCommand(“ClearFlags”, dbEngine); SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCmd); dbCmd.CommandType = CommandType.StoredProcedure; try { dbCmd.Parameters.AddWithValue(“@ID”, ID.ToString()); dbEngine.Open(); dbCmd.ExecuteNonQuery(); dbEngine.Close(); returnValue = true; } catch (Exception ex) { ErrorHandler(ex); } return returnValue; } […]

我怎么能抓到404?

我有以下代码: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = “HEAD”; request.Credentials = MyCredentialCache; try { request.GetResponse(); } catch { } 如何捕获特定的404错误? WebExceptionStatus.ProtocolError只能检测到发生了错误,但没有提供错误的确切代码。 例如: catch (WebException ex) { if (ex.Status != WebExceptionStatus.ProtocolError) { throw ex; } } 只是没有用…协议exception可能是401,503,403,真的是什么。

VS 2015 IntelliSense:未预览的exception抛出

我刚刚升级到VS 2015企业版,正在使用C#。 在VS 2013中,我能够将XMLexception标记添加到我的方法中,当尝试使用该方法时,我会看到可以抛出exception的预览。 但是,在VS 2015中,当我将鼠标hover在方法调用上,或者尝试进行调用时,我无法预览可以抛出exception的内容。 如何让VS 2015显示方法可以抛出哪些exception? 以下是我的测试课程。 谢谢。 VS 2013 VS 2015

使用异步调用时exception处理的良好模式

我想使用Web API,我看到很多人推荐System.Net.Http.HttpClient 。 那很好……但我只有VS-2010,所以我还不能使用async/await 。 相反,我想我可以将Task组合使用到ContinueWith 。 所以我尝试了这段代码: var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(“application/json”)); client.GetStringAsync(STR_URL_SERVER_API_USERS).ContinueWith(task => { var usersResultString = task.Result; lbUsers.DataSource = JsonConvert.DeserializeObject<List>(usersResultString); }); 我的第一个观察是认识到如果URL不可用它不会产生任何错误,但可能会有更多这样的错误…… 所以我试图找到一种方法来处理这种异步调用的exception(特别是对于HttpClient)。 我注意到“任务”有IsFaulted属性和AggregateException可能会被使用,但我不确定如何。 另一个观察是GetStringAsync返回Task ,但GetAsync返回Task 。 后者可能更有用,因为它提供了一个StatusCode 。 您能否共享一个关于如何正确使用异步调用并以良好方式处理exception的模式? 基本的解释也将受到赞赏。

如何在不丢失堆栈跟踪的情况下重新抛出TargetInvocationException的内部exception

我有许多使用Delegate.DynamicInvoke调用的方法。 其中一些方法进行数据库调用,我希望能够捕获TargetInvocationException并且不捕获TargetInvocationException并通过其内部搜索来查找实际出错的地方。 我正在使用此方法重新抛出,但它清除了堆栈跟踪: try { return myDelegate.DynamicInvoke(args); } catch(TargetInvocationException ex) { Func getInner = null; getInner = delegate(TargetInvocationException e) { if (e.InnerException is TargetInvocationException) return getInner((TargetInvocationException) e.InnerException); return e.InnerException; }; Exception inner = getInner(ex); inner.PreserveStackTrace(); throw inner; } PreserveStackTrace方法是我修复的扩展方法,感谢另一篇文章(我不知道它实际上做了什么)。 但是,这似乎不会保留跟踪: public static void PreserveStackTrace(this Exception e) { var ctx = new StreamingContext(StreamingContextStates.CrossAppDomain); var mgr = […]

当.NET线程抛出exception时会发生什么?

我们有一个接口IPoller,我们有各种各样的实现。 我们有一个进程将接受一个I​​Poller并在一个单独的线程中启动它。 我正在尝试提出一种通用方法,为任何不自行处理的IPoller提供exception处理。 我最初的想法是创建一个接受IPoller的IPoller实现,并提供一些日志function。 我遇到的问题是如何提供此error handling? 如果我有IPoller.Start()这是Thread的目标,那将发生exception? 或者我可以挂钩的线程本身有什么东西?

使用ASP.NET Web API进行error handling的最佳实践

您能否澄清一下Web API错误管理的最佳实践? 实际上,我不知道将try catch用于我的Api请求是否是一个好习惯。 public Vb.Order PostOrderItem(Vb.Order order) { if (OAuth.isValid(Request.Headers.GetValues(“Token”).Single()) != true) { HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized); throw new HttpResponseException(httpResponseMessage); } if (!ModelState.IsValid) { HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); throw new HttpResponseException(httpResponseMessage); } try { return Vb.Document.Generate(order); } catch (Exception ex) { logger.Error(ex); HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); httpResponseMessage.Content = new StringContent(ex.Message); throw […]

“使用例外控制流程”的示例

“使用exception来控制流”的代码是什么样的? 我试图找到一个直接的C#示例,但不能。 为什么不好? 谢谢

我不应该抓住哪些例外情况?

我有一个运行长批处理的应用程序,可能会抛出许多exception。 如果在批处理中的一个项目期间抛出非关键exception,我只想记录并继续,这样我们可以稍后解决问题,同时让其他批处理项继续。 一些例外,例如OutOfMemoryException ,对整个应用程序来说是毁灭性的,这些我想重新抛出,以便它们冒泡到全局exception处理程序,它将记录错误并停止应用程序。 所以我的问题是,是否有一个合理的短的关键exception列表,我可以在我的下级exception处理程序中重新抛出,同时抑制(记录后)其他所有内容? 谢谢! 编辑:稍微详细说明,这是我的程序的基本结构 foreach(var item in longItemList) { try { bigDynamicDispatchMethod(item); } catch(Exception ex) { logException(ex); } } 可能会抛出大量exception,因为这个循环几乎是我应用程序的顶级。 我项目中99%的代码都在调度方法之后。 我在较低级别进行合理的exception处理,但是错误仍然存​​在,我不想在抛出exception后停止批处理中的其他无关进程。 试图找到可以在我的应用程序中的其他地方抛出哪些exception似乎是一项艰巨的任务,似乎更容易获得关键exception的黑名单。 有没有更好的方法来构建我的应用程序来处理这个? 我愿意接受建议。

在单独的线程上捕获未处理的exception

我正在使用以下事件来捕获主UI线程中的未处理exception。 Application.ThreadException 不幸的是,它没有在单独的线程中捕获那些未处理的错误。 我知道 AppDomain.CurrentDomain.UnhandledException 但是,这似乎会在触发时关闭应用程序,而前者则不会。 有没有办法在单独的线程上处理未处理的exception,而不关闭应用程序?