ASP.NET Core UseExceptionHandler:异常在哪里?

时间:2021-01-09 23:14:10

标签: c# .net asp.net-core error-handling

在我的 ASP.NET Core 3.1 应用程序中,Startup 类中有这样的代码:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStatusCodePagesWithReExecute("/error/{0}");
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/error/500");
        app.UseHsts();
    }

    // ...
}

ErrorController 有这样的动作:

public IActionResult Index(int id)
{
    var context = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
    var exception = context?.Error;
    if (exception != null)
    {
        logger.LogCritical(exception, $"Unhandled exception in request {HttpContext.TraceIdentifier}: {exception.GetRecursiveMessage()}");
    }
    else
    {
        logger.LogCritical(exception, $"Unhandled exception in request {HttpContext.TraceIdentifier}, no exception available");
    }

    // ...
}

从我读到的内容来看,这应该给我另一个动作中发生的未处理异常。但事实并非如此。异常对象为空。我也尝试使用 IExceptionHandlerFeature 类型的其他功能,但它是一样的。任何地方都不例外。

如何在错误处理程序中获取异常?

请注意,我正在使用重新执行功能,因为我讨厌在出现错误时将用户转发到不同的 URL。这只会让事情变得更糟,因为重新加载页面以“重试”肯定不会解决任何问题(毕竟这是错误页面,它只能显示错误)。

2 个答案:

答案 0 :(得分:3)

要获取异常对象,您可以使用 IExceptionHandlerFeature

public IActionResult Error()
{
   // Retrieve error information in case of internal errors
   var error = HttpContext
          .Features
          .Get<IExceptionHandlerFeature>();

   if (error == null)
     ...

  // Use the information about the exception 
  var exception = error.Error;
   ...
}

答案 1 :(得分:0)

private void SaveItemData() { //Getting Data from UI { using (SqlConnection sqlCon = new SqlConnection(myconnstring)) { sqlCon.Open(); string SelectQuery = "Select (Max(item_id) +1) from tbl_items"; SqlCommand Command = new SqlCommand(SelectQuery, sqlCon); SqlDataReader sdr = Command.ExecuteReader(); if (sdr.Read()) { try { bool success = false; int val = int.Parse(sdr[0].ToString()); int val2 = int.Parse(CreateItemTextBoxID.Text); if (val2 > val) { ibll.item_aliasname = CreateItemTextBoxAliasName.Text; ibll.item_barcode = CreateItemTextBoxBarCode.Text; ibll.item_name = CreateItemTextBoxItemName.Text; ibll.item_genericname_id = Convert.ToInt32(CreateItemComboBoxGenericName.SelectedValue); ibll.item_genericname = CreateItemComboBoxGenericName.Text; ibll.item_manufacturer_id = Convert.ToInt32(CreateItemComboBoxManufacturer.SelectedValue); ibll.item_manufacturer = CreateItemComboBoxManufacturer.Text; ibll.item_class_id = Convert.ToInt32(CreateItemComboBoxClass.SelectedValue); ibll.item_class = CreateItemComboBoxClass.Text; ibll.item_category_id = Convert.ToInt32(CreateItemComboBoxCategory.SelectedValue); ibll.item_category = CreateItemComboBoxCategory.Text; ibll.item_location_id = Convert.ToInt32(CreateItemComboBoxLocation.SelectedValue); ibll.item_location = CreateItemComboBoxLocation.Text; ibll.item_pieces_in_packing = int.Parse(CreateItemTextBoxPIP.Text); ibll.item_packing_desc_id = Convert.ToInt32(CreateItemComboBoxPackingDesc.SelectedValue); ibll.item_packing_desc = CreateItemComboBoxPackingDesc.Text; ibll.item_pack_purchase_price = Convert.ToDecimal(CreateItemTextBoxPPrice.Text); ibll.item_unit_purchase_price = Convert.ToDecimal(CreateItemTextBoxUPPrice.Text); ibll.item_pack_mrp = Convert.ToDecimal(CreateItemTextBoxPRPrice.Text); ibll.item_unit_mrp = Convert.ToDecimal(CreateItemTextBoxURPrice.Text); ibll.item_reg_num = CreateItemTextBoxRegNum.Text; ibll.item_packsalestax = Convert.ToDecimal(CreateItemTextBoxPST.Text); ibll.item_created_by_id = 1; ibll.item_created_by = CreateItemTextBoxCreatedBy.Text ?? "Aamir"; ibll.item_created_datetime = DateTime.Now; isbll.item_id = int.Parse(CreateItemTextBoxID.Text); isbll.item_name = (CreateItemTextBoxItemName.Text); isbll.item_active_status = CreateItemCheckBoxActiveStatus.Checked; isbll.item_printable = CreateItemCheckBoxPrintable.Checked; isbll.item_generatepo = CreateItemCheckBoxGeneratePO.Checked; isbll.item_alert_id = Convert.ToInt32(CreateItemComboBoxItemAlerts.SelectedValue); isbll.item_alert_name = CreateItemComboBoxItemAlerts.Text; isbll.item_max_sale_disc_percent = Convert.ToDecimal(CreateItemTextBoxMSD.Text); isbll.item_pack_sale_price = decimal.Parse(CreateItemTextBoxPSPrice.Text); isbll.item_unit_sale_price = decimal.Parse(CreateItemTextBoxUSPrice.Text); isbll.item_allowdue = CreateItemCheckBoxAllowDue.Checked; isbll.item_optimum_quantity = Convert.ToDecimal(CreateItemTextBoxOptimumQty.Text); isbll.item_minimum_quantity = Convert.ToDecimal(CreateItemTextBoxMinimumQty.Text); isbll.item_reorder_quantity = Convert.ToDecimal(CreateItemTextBoxReorderQty.Text); isbll.item_settings_created_by_id = 1; isbll.item_settings_created_by = "Aamir"; isbll.item_settings_created_datetime = DateTime.Now; bool a = idal.CreateNewItem(ibll); bool b = isdal.CreateNewItemSettings(isbll); foreach (DataGridViewRow dgvRow in CreateItemDataGridViewSuppliers.Rows) { if (dgvRow.IsNewRow) { break; } else { ibll.item_id = int.Parse(CreateItemTextBoxID.Text); int suppid = Convert.ToInt32(dgvRow.Cells["SuppDGVSuppliers"].Value); ibll.supp_id = suppid; itemBLL si = idal.SelectSupplierNameByID(suppid); ibll.item_supp_name = si.item_supp_name; ibll.item_supp_priority = Convert.ToInt32(dgvRow.Cells["SuppDGVPriority"].Value); ibll.item_supp_qty = Convert.ToDecimal(dgvRow.Cells["SuppDGVQty"].Value); ibll.item_supp_rate = Convert.ToDecimal(dgvRow.Cells["SuppDGVRate"].Value); ibll.item_supp_discperc = Convert.ToDecimal(dgvRow.Cells["SuppDGVDiscPerc"].Value); ibll.item_supp_bonus = Convert.ToInt32(dgvRow.Cells["SuppDGVBonus"].Value); int daysid = Convert.ToInt32(dgvRow.Cells["SuppDGVBookingDays"].Value); itemBLL di = idal.SelectDaysByID(daysid); ibll.item_supp_days_id = daysid; ibll.item_supp_days = di.item_supp_days; bool c = idal.AddItemSuppliers(ibll); success = a && b && c; if (success == true) { MetroMessageBox.Show(this, "Item " + CreateItemTextBoxItemName.Text + " Has been added in the Database successfully", "Success", MessageBoxButtons.OK, 100); ClearForm(); CreateItemTextBoxItemName.Focus(); } else { MetroMessageBox.Show(this, "Failed To add Item " + CreateItemTextBoxItemName.Text + " In the Database", "Failed", MessageBoxButtons.OK); } } } } else { ibll.item_id = val2; ibll.item_aliasname = CreateItemTextBoxAliasName.Text; ibll.item_barcode = CreateItemTextBoxBarCode.Text; ibll.item_name = CreateItemTextBoxItemName.Text; ibll.item_genericname_id = Convert.ToInt32(CreateItemComboBoxGenericName.SelectedValue); ibll.item_genericname = CreateItemComboBoxGenericName.Text; ibll.item_manufacturer_id = Convert.ToInt32(CreateItemComboBoxManufacturer.SelectedValue); ibll.item_manufacturer = CreateItemComboBoxManufacturer.Text; ibll.item_class_id = Convert.ToInt32(CreateItemComboBoxClass.SelectedValue); ibll.item_class = CreateItemComboBoxClass.Text; ibll.item_category_id = Convert.ToInt32(CreateItemComboBoxCategory.SelectedValue); ibll.item_category = CreateItemComboBoxCategory.Text; ibll.item_location_id = Convert.ToInt32(CreateItemComboBoxLocation.SelectedValue); ibll.item_location = CreateItemComboBoxLocation.Text; ibll.item_pieces_in_packing = int.Parse(CreateItemTextBoxPIP.Text); ibll.item_packing_desc_id = Convert.ToInt32(CreateItemComboBoxPackingDesc.SelectedValue); ibll.item_packing_desc = CreateItemComboBoxPackingDesc.Text; ibll.item_pack_purchase_price = Convert.ToDecimal(CreateItemTextBoxPPrice.Text); ibll.item_unit_purchase_price = Convert.ToDecimal(CreateItemTextBoxUPPrice.Text); ibll.item_pack_mrp = Convert.ToDecimal(CreateItemTextBoxPRPrice.Text); ibll.item_unit_mrp = Convert.ToDecimal(CreateItemTextBoxURPrice.Text); ibll.item_reg_num = CreateItemTextBoxRegNum.Text; ibll.item_packsalestax = Convert.ToDecimal(CreateItemTextBoxPST.Text); ibll.item_created_by_id = 1; ibll.item_created_by = CreateItemTextBoxCreatedBy.Text ?? "Aamir"; ibll.item_created_datetime = DateTime.Now; isbll.item_id = int.Parse(CreateItemTextBoxID.Text); isbll.item_name = (CreateItemTextBoxItemName.Text); isbll.item_active_status = CreateItemCheckBoxActiveStatus.Checked; isbll.item_printable = CreateItemCheckBoxPrintable.Checked; isbll.item_generatepo = CreateItemCheckBoxGeneratePO.Checked; isbll.item_alert_id = Convert.ToInt32(CreateItemComboBoxItemAlerts.SelectedValue); isbll.item_alert_name = CreateItemComboBoxItemAlerts.Text; isbll.item_max_sale_disc_percent = Convert.ToDecimal(CreateItemTextBoxMSD.Text); isbll.item_pack_sale_price = decimal.Parse(CreateItemTextBoxPSPrice.Text); isbll.item_unit_sale_price = decimal.Parse(CreateItemTextBoxUSPrice.Text); isbll.item_allowdue = CreateItemCheckBoxAllowDue.Checked; isbll.item_optimum_quantity = Convert.ToDecimal(CreateItemTextBoxOptimumQty.Text); isbll.item_minimum_quantity = Convert.ToDecimal(CreateItemTextBoxMinimumQty.Text); isbll.item_reorder_quantity = Convert.ToDecimal(CreateItemTextBoxReorderQty.Text); isbll.item_settings_created_by_id = 1; isbll.item_settings_created_by = "Aamir"; isbll.item_settings_created_datetime = DateTime.Now; bool a = idal.UpdateExistingItem(ibll); bool b = isdal.UpdateExistingItemSettings(isbll); foreach (DataGridViewRow dgvRow in CreateItemDataGridViewSuppliers.Rows) { if (dgvRow.IsNewRow) { break; } else { ibll.item_id = int.Parse(CreateItemTextBoxID.Text); int suppid = Convert.ToInt32(dgvRow.Cells["SuppDGVSuppliers"].Value); ibll.supp_id = suppid; itemBLL si = idal.SelectSupplierNameByID(suppid); ibll.item_supp_name = si.item_supp_name; ibll.item_supp_priority = Convert.ToInt32(dgvRow.Cells["SuppDGVPriority"].Value); ibll.item_supp_qty = Convert.ToDecimal(dgvRow.Cells["SuppDGVQty"].Value); ibll.item_supp_rate = Convert.ToDecimal(dgvRow.Cells["SuppDGVRate"].Value); ibll.item_supp_discperc = Convert.ToDecimal(dgvRow.Cells["SuppDGVDiscPerc"].Value); ibll.item_supp_bonus = Convert.ToInt32(dgvRow.Cells["SuppDGVBonus"].Value); int daysid = Convert.ToInt32(dgvRow.Cells["SuppDGVBookingDays"].Value); itemBLL di = idal.SelectDaysByID(daysid); ibll.item_supp_days_id = daysid; ibll.item_supp_days = di.item_supp_days; bool c = idal.UpdateItemSuppliers(ibll); success = a && b && c; if (success == true) { MetroMessageBox.Show(this, "Item " + CreateItemTextBoxItemName.Text + " Has been added in the Database successfully", "Success", MessageBoxButtons.OK, 100); ClearForm(); CreateItemTextBoxItemName.Focus(); } else { MetroMessageBox.Show(this, "Failed To add Item " + CreateItemTextBoxItemName.Text + " In the Database", "Failed", MessageBoxButtons.OK); } } } } } catch (Exception ex) { MetroMessageBox.Show(this, "Error Occured " + ex.Message + "Error", "Failed", MessageBoxButtons.OK); } finally { sqlCon.Close(); } } } } } 中间件仅在目前生成的响应没有正文时运行。

如果您想在操作中捕获异常,可以使用自定义的 ExceptionHandler。

StatusCodePages

startup.cs:

public class CustomExceptionHandler
{
    private readonly IWebHostEnvironment _environment;

    public CustomExceptionHandler(IWebHostEnvironment environment)
    {
        _environment = environment;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        var feature = httpContext.Features.Get<IExceptionHandlerFeature>();
        var error = feature?.Error;

        if (error != null)
        {
            //LogError
        }

        await Task.CompletedTask;
    }
}