2015-02-21 3 views
0

Иногда (не всегда, в большинстве случаев он работает безупречно), я поймаю исключение, которое я предоставил, когда он не загружает Texture2D.Загрузка Texture2D непостоянно сбой

public static class Extras 
{ 
    public static class Load 
    { 
     private static Dictionary<string, Texture2D> Textures; 

     public static Texture2D Texture(string Path) 
     { 
      if (Textures == null) Textures = new Dictionary<string, Texture2D>(); 
      if (Textures.ContainsKey(Path)) return Textures[Path]; 
      else 
      { 
       try { Textures.Add(Path, Service<ContentManager>().Load<Texture2D>(Path)); return Textures[Path]; 
       catch { throw new ArgumentNullException(string.Format("Failed to load Texture2D from \"{0}\"!", Path)); } 
      } 
      return null; 
     } 
    } 

    public static class Services 
    { 
     private static GameServiceContainer Container; 

     public static T Get<T>() { return (T)Container.GetService(typeof(T)); } 
     public static void Add<T>(T Service) { if (Container == null) Container = new GameServiceContainer(); Container.AddService(typeof(T), Service); } 
     public static void Remove<T>() { Container.RemoveService(typeof(T)); } 
    } 
    public static T Service<T>() { return Services.Get<T>(); } 
} 

-

Когда игра нагрузка:

Extras.Services.Add<ContentManager>(Content); 

Texture2D Texture = Extras.Load.Texture("Textures\\Player"); 

Теперь в большинстве случаев это работает, но иногда я получаю исключение (при первой загрузке текстуры в игру).

Почему это непоследовательно не загружает Texture2D?

+0

Что именно исключение? –

+0

@Silveor "catch {throw new ArgumentNullException (string.Format (" Не удалось загрузить Texture2D из \ "{0} \"! ", Path));}" –

ответ

0

Во-первых, format your code, особенно если вы собираетесь его опубликовать.

try 
{ 
    Textures.Add(Path, Service<ContentManager>().Load<Texture2D>(Path)); 
    return Textures[Path]; 
} 
catch 
{ 
    throw new ArgumentNullException(string.Format("Failed to load Texture2D from \"{0}\"!", Path)); 
} 

Или просто нажмите Ctrl + E, Ctrl + D (в моем VS 2010 по умолчанию) перед фрагментом кода копирования.

Во-вторых, уловка секций должна обрабатывать исключение уже возникшей очереди, но вы игнорируете ее, вместо этого просто бросаете новую. Также обратите внимание, что ArgumentNullException является специальным подклассом Exception, который возникает при попытке получить доступ к несуществующему объекту. Если вы хотите бросить обычай, он должен логически соответствовать ситуации. Если вы не уверены на 100%, что произошло, бросьте базовый объект Exception.

try 
{ 
    // critical code section 
} 
catch (Exception ex) 
{ 
    System.Diagnostics.Debug.WriteLine(ex.Message); 
} 

Пожалуйста, ознакомьтесь с документацией о попытке поймать, чтобы понять, как это работает.

И последнее. В Visual Studio (мой 2010) вы можете перейти к элементу Debug -> Exceptions и установить флажок «Исключения CLR». Он позволяет сразу же просматривать исключения во время их выполнения.

+0

Я в 2010 году, и я не могу найти эту опцию , хотя я думаю, что он уже включен, я вижу свои исключения, когда их бросают в режим отладки. –

+0

Итак, что именно исключение? Если вы видите это, вы должны легко определить его источник. –

+0

Очевидно, ContentManager имеет значение NULL. –

Смежные вопросы