在我的 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。这只会让事情变得更糟,因为重新加载页面以“重试”肯定不会解决任何问题(毕竟这是错误页面,它只能显示错误)。
答案 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;
}
}