2015-09-20 50 views
2

我有以下接口:「並非所有的代碼路徑返回一個值」使用「try和catch」塊

//define a method to create a Stream from a generic source 
interface IStream 
{ 
    Stream GetStream(); 
} 

//define a method to deserialize an object from a stream 
interface IDeserializer<T> 
{ 
    T GetObject(); 
} 

及以下兩種實現它們的類:

//create a new Stream from a URL source 
class UrlReader : IStream 
{ 
    private String url; 

    public UrlReader(String u) 
    { url = u; } 

    public Stream GetStream() 
    { 
     using (var client = new WebClient()) 
     { 
      Stream stream = client.OpenRead(url); 
      return stream; 
     } 
    } 
} 

//deserialize a JSON object implementing the interface IDeserializer 
class JsonDeserializer<T> : IDeserializer<T> 
{ 
    private String json; 

    public JsonDeserializer(String j) 
    { json = j; } 

    public T GetObject() 
    { 
     return JsonConvert.DeserializeObject<T>(json); 
    } 
} 

我想將try和catch塊添加到兩個方法來管理異常,但是如果我這樣做不是所有的代碼路徑都會返回一個值。我知道解決這個問題的一種方法是在try塊之前將decalre和初始化變量返回。但是我不能初始化Stream類型的變量,因爲這是一個抽象類,我不能初始化一個泛型類型變量T. 您能否請告知如何解決這個問題?

回答

0

你要麼需要找到一個具體實現流的,如MemoryStream,創建一個實例並返回它

回報null在這種情況下,其他人可能碰上一個NullReferenceException

讓例外走thoug H。

想一想,是否返回一個空的流是一個好主意。有人會嘗試讀取它並遇到其他問題。

一個例外並不是一個壞主意,因爲它留下了對該函數的用戶做什麼的決定。

0

使用default(T)並讓它返回NULL(您的Stream是引用類型)。

簡單的例子:

class test<T> 
{ 
    public T Return() 
    { 
     return default(T); 
    } 
} 

void Main() 
{ 
    Console.WriteLine ((new test<string>()).Return()); 
    Console.WriteLine ((new test<int>()).Return()); 
    Console.WriteLine ((new test<Stream>()).Return()); 
} 

這將輸出

null 
0 
null 

stringStream是引用類型,因此default(T)返回NULL。 int是默認值爲零的值類型,因此它將返回0.

0

對於Stream:僅返回NULL。如果您不喜歡NULL,只需創建一個像MemoryStream這樣的空白流並將其返回即可。

對於泛型類型:返回默認值,即default(T)。有關default關鍵字的更多詳細信息,請檢查此link

0

如果發生異常,則返回顯而易見的事情。

如果沒有明顯的東西要返回,那麼這是處理該異常的錯誤地方。要麼讓異常通過,要麼拋出一個更具體的異常。

這裏肯定會出現這種情況。

0

最終如何處理內存流?

public class W : I 
    { 
     public Stream GetStream() 
     { 
      MemoryStream ms = new MemoryStream(); 

      try 
      { 
       var connectStream = new WebClient().OpenRead("http://www.google.com"); 
       if (connectStream != null) 
       { 
        connectStream.CopyTo(ms); 
       } 
      } 
      catch (Exception) 
      { 
       throw; 
      } 

      return ms; 
     } 
    } 

    public interface I 
    { 
     Stream GetStream(); 
    } 
相關問題