Như bạn có thể thấy, tôi đang cố gắng truyền bá GatewayConnectionFailedException tới giao diện người dùng của mình. Tôi muốn mã này bắt được mọi thứ ngoại trừ ngoại lệ và tôi muốn lớp trình bày bắt ngoại lệ đó để thông báo cho người dùng rằng cơ sở dữ liệu có vấn đề để họ có thể đi khắc phục nó. Vấn đề của tôi là khi tôi ném nó lần đầu tiên, tôi nhận được GatewayConnectionFailedException không được xử lý bởi mã người dùng trong mệnh đề bắt GatewayException.
Điều quan trọng cần lưu ý là GatewayConnectionFailedException mở rộng GatewayException, mở rộng Ngoại lệ. Có điều gì tôi đang thiếu hay tôi phải di chuyển tất cả các sản phẩm khai thác sang lớp trình bày?
thử
{
thứ gì đó();
}
bắt (GatewayConnectionFailedException gcfe)
{
ném;
}
bắt (GatewayException ge)
{
if (ge.GetType() == typeof(GatewayConnectionFailedException))
ném;
string errMsg = "Không thể truy xuất bản ghi do lỗi cổng dữ liệu." + GetTypeInfo();
_logger.Error(errMsg + "\r\n{0}", ge);
}
catch (Exception e)
{
if (e.GetType() == typeof(GatewayConnectionFailedException))
ném;
string errMsg = "Không thể truy xuất bản ghi do lỗi không mong muốn." + GetTypeInfo();
_logger.Error(errMsg + "\r\n{0}", e);
}
Câu hỏi ngớ ngẩn...mã giao diện người dùng của bạn có cố gắng nắm bắt khi lớp được gọi không? Phải có thứ gì đó xử lý được cú ném thứ hai...
Nói tóm lại, có vẻ như bạn đang cố gắng làm điều này:
using System;
không gian tên ConsoleApplication1
{
lớp ExceptionA: Ngoại lệ
{
chuỗi ghi đè công khai Tin nhắn
{
lấy
{
trả về "Ngoại lệ A";
}
}
}
lớp Ngoại lệB: Ngoại lệA
{
chuỗi ghi đè công khai Tin nhắn
{
lấy
{
trả về "Ngoại lệ B";
}
}
}
class Program
{
static void Main(string[] args)
{
thử
{
DoThing();
}
catch (Exception ex)
{
Console.WriteLine("Bị bắt trong mã 'UI': " + ex.Message);
}
}
khoảng trống tĩnh DoThing()
{
thử
{
ném ngoại lệB mới();
}
bắt (ngoại lệB cũ)
{
Console.WriteLine("Bắt B");
ném;
}
bắt (ExceptionA cũ)
{
Console.WriteLine("Bắt A");
}
catch (Exception ex)
{
Console.WriteLine("Bắt chung");
}
}
}
}
tạo ra đầu ra này:
Bắt B
Bị kẹt trong mã "giao diện người dùng": ngoại lệ B
Nhấn phím bất kỳ để tiếp tục...
Có vẻ như bạn đã không nắm bắt được ngoại lệ được ném thứ hai, đó là lý do tại sao nó "không được xử lý". Nếu chúng ta nhận xét try-catch trong main, chúng ta sẽ nhận được một ngoại lệ chưa được xử lý:
static void Main(string[] args)
{
//thử
//{
DoThing();
//}
// bắt (Ngoại lệ cũ)
//{
//Console.WriteLine("Bị bắt trong mã 'UI': " + ex.Message);
//}
}
tạo ra đầu ra sau:
Bắt B
Ngoại lệ chưa được xử lý: ConsoleApplication1.ExceptionB: Ngoại lệ B trong ConsoleApplication1.Program.DoThing() trong C:\Users\Giovanni\AppData\Local\T Dự án tạm thời\ConsoleApplication1\Program.cs: dòng 50 trong C:\Users ConsoleApplication1.Program. Main(String[] trong \Giovanni\AppDa args)ta\Local\Temporary Projects\ConsoleApplication1\Program.cs: Dòng 33 Nhấn phím bất kỳ để tiếp tục. .
Tôi là một lập trình viên xuất sắc, rất giỏi!