异常是一种异常情况,需要偏离程序的正常流程。通常,异常不应导致完全失败,而应由异常处理程序引起。异常处理是许多编程语言中的内置构造。通常,通过展开堆栈来处理异常,从而回滚到异常范围之外的已定义状态,然后调用处理程序块或例程。
我有一个 python 脚本,它连接到 Interactive Brokers API 并检索安全合约信息,如下所示: 从 ibapi.client 导入 * 从 ibapi.wrapper 导入 * 导入时间 Te 类...
为什么编译器在编译时无法检测到有关 Serialized 声明的错误?
来自Serialized接口的JavaDoc第二段: 为了允许不可序列化类的子类型被序列化, 子类型可能承担保存和恢复状态的责任...
我正在开发一个Python应用程序,我需要优雅地处理异常并记录有用的信息以进行调试。具体来说,我想捕获运行期间发生的异常...
我在共享组件中有以下代码: 公共类我的类{ 公共无效DoWork(){ // ... 如果(someConditionWhichShouldAlwaysBeFalse){ 抛出新的例外...
有没有一种方法可以在 C++ 中使用异常,而不会增加我 60k 的二进制大小?
我正在嵌入式平台上工作,我不习惯向我的二进制文件添加 60k。 无论如何,有一些论据可以避免嵌入式系统上的异常,但我认为其中大多数都是虚假的。优秀...
在搜索SO后,我找不到这个问题的答案。我看到的所有问题,错误仍然被捕获。我遇到了逆问题。不管我如何重构以下
可能的重复: C:你如何模拟“异常”? 你好,我知道异常处理在 C++ 中可用,但在 C 中则不然。但我也读到,异常处理是提供给...
给定一个流水线CPU,当在流水线中执行指令时,CPU何时以及如何被中断或异常中断? 在哪个阶段处理中断/异常,以及什么
如何在 while 循环中正确使用 try/catch 块来处理 Java 中的无效输入?
我正在尝试编写一个Java程序,要求用户在while循环中输入一个正整数。循环应继续,直到提供有效输入。 我尝试过使用 try/catch 块来...
如何捕获并处理在 C 中调用 Py_Initialize() 时发生的致命错误
我将 Python 嵌入到 C 中,在代码的开头我有如下所示的内容。一切正常,直到用户意外删除了 python33 文件夹。这会导致 Py_Initialize() 抛出一个 f...
我试图处理我正在开发的素数检测器代码中的一些异常。这是我当前的代码: 导入 javax.swing.*; 导入 java.awt.*; 导入 java.awt.event.*; 导入java。
我正在尝试弄清楚如何为我用 Julia 编写的库实现自定义异常类型。 这是我到目前为止所想出的,主要是通过以下我找到的信息
我有几个“使用消息类”创建的自定义异常类。由于我无法直接从他们那里获取消息,因此我想创建一个实用程序方法,从给定的
对于Python,有没有一种方法可以从发生异常的上下文中打印变量范围?
有没有办法从发生异常的上下文中打印变量范围? 例如: def f(): 一个= 1 b = 2 1/0 尝试: f() 除了: 在此处传递 # 我想打印一些类似...
我不知道这是否是一个错误,或者我只是不明白发生了什么。如果我有一个 run 语句作为 try 块中的最后一个语句,则不会捕获 run 语句中的任何错误。如果没有的话...
php mysqli 异常会忽略大量 catch 块,直到最后一个(在任何类之外)
我有一个mysqli调用($result = $this->mysqli->query($query)),其中$query是一个生成错误的插入语句:“重复条目'dt'键'username_UNIQUE'” ;. 我...
GlobalExceptionHander 测试失败将内容复制到流时出错
我为最小的 API 创建了一个 GlobalExceptionHandler 和一些单元测试来验证处理程序。 我的处理程序如下所示: 内部类 GlobalExceptionHandler(ILoggerWrapper 我为最小的 API 创建了 GlobalExceptionHandler 和一些单元测试来验证处理程序。 我的处理程序看起来像这样: internal class GlobalExceptionHandler(ILoggerWrapper<GlobalExceptionHandler> logger) : IExceptionHandler { /// <inheritdoc cref="IExceptionHandler.TryHandleAsync"/> public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken) { ProblemDetails problemDetails = new() { Status = StatusCodes.Status500InternalServerError, //TODO: Build a visible endpoint to describe the exception CV-27246 Type = "https://httpstatuses.com/500", Detail = exception.StackTrace }; Action<Exception> logAction = logger.LogCritical; switch (exception) { case OperationCanceledException: problemDetails.Title = "The operation has been canceled."; break; case OutOfMemoryException: problemDetails.Title = "There was an error, Out of memory. Please see logs for more information."; break; case StackOverflowException: problemDetails.Title = "There was an error, StackOverflow. Please see logs for more information."; break; case SEHException: problemDetails.Title = "There was an error, SEHException. Please see logs for more information."; break; default: logAction = logger.LogError; problemDetails.Status = StatusCodes.Status417ExpectationFailed; //TODO: Build a visible endpoint to describe the exception CV-27246 problemDetails.Type = "https://httpstatuses.com/417"; problemDetails.Title = $"{exception.Message} Please see logs for more information."; break; } logAction(exception); httpContext.Response.StatusCode = problemDetails.Status.HasValue ? problemDetails.Status.Value : StatusCodes.Status500InternalServerError; httpContext.Response.ContentType = "application/json"; await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken); var canContinue = logAction != logger.LogCritical; return canContinue; } } 当抛出上述错误之一时,它正在工作并返回 false。 在我的集成测试中我添加了: protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.Configure(app => { app.UseExportService(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("throw-out-of-memory", UnhandledExceptionEndpoints.ThrowOutOfMemory); endpoints.MapGet("throw-stack-overflow", UnhandledExceptionEndpoints.ThrowStackOverflow); endpoints.MapGet("throw-seh", UnhandledExceptionEndpoints.ThrowSEHException); endpoints.MapGet("throw-handeled", UnhandledExceptionEndpoints.ThrowHandledException); }); }); } 这只是抛出所要求的异常。 单元测试如下所示: [Fact] public async Task OperationCanceledException_ShouldReturn500() { //Arrange var client = _factory.CreateClient(); HttpResponseMessage? response = null; //Act response = await client.GetAsync("throw-out-of-memory"); var problemDetails = await response.Content.ReadFromJsonAsync<ProblemDetails>(); //Assert response.IsSuccessStatusCode.Should().BeFalse(); problemDetails.Status.Should().Be(500); problemDetails.Type.Should().Be("https://httpstatuses.com/500");//TODO: Build a visible endpoint to describe the exception CV-27246 problemDetails.Title.Should().Be("There was an error, Out of memory. please see logs for more information."); } 直到最近,所有这些都运行正常。它似乎在 CI/CD 上运行得很好,但是当我在本地运行它时,出现以下错误: System.Net.Http.HttpRequestException Error while copying content to a stream. at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore(Task serializeToStreamTask, MemoryStream tempBuffer) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at ExportService.Tests.Intergration.Middleware.GlobalExceptionHandlerTests.OperationCanceledException_ShouldReturn500() in C:\Users\james.tays\source\repos\Components\src\ExportService\ExportService.Tests.Intergration\Middleware\GlobalExceptionHandlerTests.cs:line 72 at Xunit.Sdk.TestInvoker`1.<>c__DisplayClass47_0.<<InvokeTestMethodAsync>b__1>d.MoveNext() in /_/src/xunit.execution/Sdk/Frameworks/Runners/TestInvoker.cs:line 259 --- End of stack trace from previous location --- at Xunit.Sdk.ExecutionTimer.AggregateAsync(Func`1 asyncAction) in /_/src/xunit.execution/Sdk/Frameworks/ExecutionTimer.cs:line 48 at Xunit.Sdk.ExceptionAggregator.RunAsync(Func`1 code) in /_/src/xunit.core/Sdk/ExceptionAggregator.cs:line 90 System.IO.IOException at Microsoft.AspNetCore.TestHost.ResponseBodyReaderStream.CheckAborted() at Microsoft.AspNetCore.TestHost.ResponseBodyReaderStream.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken) at System.IO.Stream.<CopyToAsync>g__Core|27_0(Stream source, Stream destination, Int32 bufferSize, CancellationToken cancellationToken) at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore(Task serializeToStreamTask, MemoryStream tempBuffer) System.OutOfMemoryException OutOfMemory at ExportService.Tests.Intergration.Endpoints.UnhandledExceptionEndpoints.ThrowOutOfMemory() in C:\Users\james.tays\source\repos\Components\src\ExportService\ExportService.Tests.Intergration\Endpoints\UnhandledExceptionEndpoints.cs:line 15 at lambda_method19(Closure, Object, HttpContext) at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.Invoke(HttpContext context) --- End of stack trace from previous location --- at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.HandleException(HttpContext context, ExceptionDispatchInfo edi) at Microsoft.AspNetCore.TestHost.HttpContextBuilder.<>c__DisplayClass23_0.<<SendAsync>g__RunRequestAsync|0>d.MoveNext() 在调试时我永远无法做到: var problemDetails = await response.Content.ReadFromJsonAsync<ProblemDetails>(); 您能解释一下为什么这个异常没有被处理吗?我刚刚在处理程序中返回 true,但它仍然具有相同的行为。 在我的服务中,我确实有以下几点: services.AddProblemDetails(); services.AddExceptionHandler<GlobalExceptionHandler>(); 解决方案 您对IExceptionHandler的实施不正确。 TryHandleAsync()方法的结果应该是一个布尔标志,指示是否应调用下一个异常处理程序并尝试处理异常,而不是请求管道是否可以根据错误严重性继续。 所以,如果你回来: false - 这意味着您的异常处理程序没有处理异常。如果您只想记录一些有关异常的内容并且对处理它不感兴趣,这可能很有用。 true - 这意味着您的异常处理程序成功处理了异常,并且不需要进一步的异常。这就是为什么在此之后不会执行其他异常处理程序。 另外: 如果任何异常处理程序均未处理异常,则控制权将回退到中间件的默认行为和选项。 ~ ASP.NET Core 文档 如果您写信给回复,则应始终返回true: await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken); return true; 这一切是如何发生的 默认行为就是您的情况所发生的情况,尽管我必须承认我花了一段时间才揭开它的面纱。当你查看这段ExceptionHandlerMiddleware实现的源代码时(完整源代码位于GitHub): string? handler = null; var handled = false; foreach (var exceptionHandler in _exceptionHandlers) { handled = await exceptionHandler.TryHandleAsync(context, edi.SourceException, context.RequestAborted); if (handled) { handler = exceptionHandler.GetType().FullName; break; } } 您可以看到这里的逻辑循环访问异常处理程序。但由于只注册了一个处理程序,而且是您自定义的处理程序,因此我们退出 for every 并将 handled 变量设置为 false。 这允许满足下面的 if 语句并陷入其中: if (!handled) { if (_options.ExceptionHandler is not null) { await _options.ExceptionHandler!(context); } else { handled = await _problemDetailsService!.TryWriteAsync(new() { HttpContext = context, AdditionalMetadata = exceptionHandlerFeature.Endpoint?.Metadata, ProblemDetails = { Status = DefaultStatusCode }, Exception = edi.SourceException, }); if (handled) { handler = _problemDetailsService.GetType().FullName; } } } 选项中的异常处理程序为空,因此控制回退到默认行为并尝试将标准问题详细信息写入响应。但它未能这样做,因为此时响应已经写好了。您的自定义异常处理程序GlobalExceptionHandler已经设置了响应状态代码、响应标头并写入响应流。结果,引发了另一个异常: System.InvalidOperationException:无法修改响应标头,因为响应已经开始。 但是,由于中间件抑制了次要异常(这样做是正确的!),我们又回到了最初的异常。而那个包裹在一些内部框架结构中的东西最终被抛出:
如何在 WinUI 3 Net 8 中显示流中的 MediaPlayerElement
我有 Stream,我想从该流创建 WinUI 3 的 MediaPlayerElement。 这是我的代码: var mediaPlayer = new MediaPlayer() { 自动播放 = x.自动播放, 源 = MediaSource.CreateFrom...
javax.servlet.ServletException:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 16 的倍数
如何解决以下问题。 动作.java: byte[] decValue = c.doFinal(decordedValue); account_bean fromBean = (account_bean) 形式; String account_name = fromBean.getName(); 字符串加密_密码...
2 线程“main”中的方法异常 java.util.NoSuchElementException
我不断收到 Exception in thread "main" java.util.NoSuchElementException 错误消息。我已经尝试过更换东西,但我仍然遇到这个问题 我尝试过声明变量...