2011-08-11 47 views
8
internal static string ReadCSVFile(string filePath) 
{ 
    try 
    { 
     ... 
     ... 
    } 
    catch(FileNotFoundException ex) 
    { 
     throw ex; 
    } 
    catch(Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     ... 
    } 
} 


//Reading File Contents 

public void ReadFile() 
{ 
    try 
    { 
     ... 
     ReadCSVFile(filePath); 
     ... 
    } 
    catch(FileNotFoundException ex) 
    { 
     ... 
    } 
    catch(Exception ex) 
    { 
     ... 
    } 
} 

Ở đây trong mẫu mã ở trên, tôi có hai hàm ReadFile và ReadCSVFile.
Trong ReadCSVFile, tôi nhận được một ngoại lệ của loại FileNotFoundExceptioon, được đánh bắt trong khối catch (FileNotFoundException). Nhưng khi tôi ném ngoại lệ này để bị bắt trong catch (FileNotFoundException) của ReadFile() Function, nó bị bắt trong khối catch (Exception) chứ không phải là catch (FileNotFoundException). Hơn nữa, trong khi gỡ lỗi, giá trị của ex nói là Object Not Initialized. Làm thế nào tôi có thể ném ngoại lệ từ hàm được gọi đến khối catch của hàm gọi mà không làm mất ngoại lệ bên trong hoặc ít nhất là thông điệp ngoại lệ?Ném ngoại lệ từ chức năng được gọi đến Chặn bắt của chức năng người gọi

+2

thể trùng lặp của [.NET - Ném ngoại lệ thực hành tốt nhất] (http://stackoverflow.com/questions/22623/net-throwing-exceptions-best-practices) – Chris

+0

khi bạn sử dụng cùng một đối tượng địa phương ngoại lệ, bạn có chắc là ngoại lệ bên trong có kiểu 'FileNotFoundException' không? – NirMH

+0

Không phải là một bản sao, nhưng một câu hỏi thiếu thông tin để hiển thị lý do tại sao nó không phải là trùng lặp :) – PVitt

Trả lời

10

Bạn phải sử dụng throw; thay vì throw ex;:

internal static string ReadCSVFile(string filePath) 
{ 
    try 
    { 
     ... 
     ... 
    } 
    catch(FileNotFoundException ex) 
    { 
     throw; 
    } 
    catch(Exception ex) 
    { 
     throw; 
    } 
    finally 
    { 
     ... 
    } 
} 

Bên cạnh đó, nếu bạn không làm gì khác trong khối catch của bạn hơn rethrowing bạn không cần khối catch ở tất cả:

internal static string ReadCSVFile(string filePath) 
{ 
    try 
    { 
     ... 
     ... 
    } 
    finally 
    { 
     ... 
    } 
} 

Chỉ thực thi khối catch khi bạn muốn thêm thông tin bổ sung vào ngoại lệ bằng cách ném một ngoại lệ mới với ngoại lệ bị bắt làm ngoại lệ bên trong hoặc khi bạn muốn xử lý ngoại lệ. Bạn không cần phải thực hiện một khối catch trong mọi phương pháp mà một ngoại lệ có thể bong bóng thông qua.

+0

Tôi đã cố gắng sử dụng chỉ ném nhưng kết quả vẫn như cũ. Hơn nữa, tôi thực sự đính kèm một tin nhắn tùy chỉnh cho ngoại lệ và sau đó ném nó. –

+0

Sau đó, bạn phải ném một ngoại lệ mới với thông điệp tùy chỉnh và ngoại lệ bị bắt là ngoại lệ bên trong: catch (Exception exc) {ném MessageException mới ("Message", exc); } – PVitt

1

Chỉ cần sử dụng chức năng được gọi. Không quá tải các khối catch với nhiều loại ngoại lệ. Hãy để người gọi chăm sóc điều đó.

1

Bạn nên thay thế

throw ex; 

bởi

throw; 
+0

Tôi đã cố gắng, nhưng không giúp đỡ. Tôi vẫn nhận được ObjectNotInitialized trong khối catcher của người gọi cho đối tượng ngoại lệ. –

+1

Đây có thể là một ngoại lệ khác? – sll

0

Trong chức năng gọi là chỉ cần sử dụng ném như thế này

try 
{ 
    //you code 
} 
catch 
{ 
    throw; 
} 

Bây giờ, nếu các ngoại lệ phát sinh ở đây thì đây sẽ bị bắt bởi chức năng người gọi.

0

Mã của bạn hoạt động tốt ở đây, Kiểm tra ở đây http://ideone.com/jOlYQ

+0

Có sự khác biệt nào nếu đoạn mã thuộc về một dịch vụ web thay vì mã giao diện điều khiển đơn giản ??? –

+0

Không nên có. Webservice một lần nữa là một serivice được lưu trữ trong một số container và đó có thể là một ứng dụng giao diện điều khiển khác mặc dù nó doesnth có một giao diện điều khiển trực quan đại diện cho người dùng. Vì vậy, về cơ bản C# và nope. – Zenwalker

Các vấn đề liên quan