加载 Texture2D 不一致地失败
Loading Texture2D Inconsistently Fails
有时(并非总是如此,大多数情况下它都能完美运行),当它无法加载 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总是失败?
首先,format your code,特别是如果你要post它。
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 中默认)。
其次,catch 部分应该处理已经发生的异常,但是您忽略它只是抛出一个新异常。另请注意,ArgumentNullException 是 Exception 的一个特殊子类,它在尝试访问不存在的对象时发生。如果你想抛出自定义异常,它应该在逻辑上对应于这种情况。如果您不能 100% 确定发生了什么,请抛出基本异常对象。
try
{
// critical code section
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
请阅读有关 try-catch 的文档以了解其工作原理。
最后一个。在 Visual Studio(我的是 2010)中,您可以转到 Debug -> Exceptions 项并首先选中 "CLR Exceptions" 复选框。它允许您在抛出运行时异常时立即看到它们。
有时(并非总是如此,大多数情况下它都能完美运行),当它无法加载 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总是失败?
首先,format your code,特别是如果你要post它。
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 中默认)。
其次,catch 部分应该处理已经发生的异常,但是您忽略它只是抛出一个新异常。另请注意,ArgumentNullException 是 Exception 的一个特殊子类,它在尝试访问不存在的对象时发生。如果你想抛出自定义异常,它应该在逻辑上对应于这种情况。如果您不能 100% 确定发生了什么,请抛出基本异常对象。
try
{
// critical code section
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
请阅读有关 try-catch 的文档以了解其工作原理。
最后一个。在 Visual Studio(我的是 2010)中,您可以转到 Debug -> Exceptions 项并首先选中 "CLR Exceptions" 复选框。它允许您在抛出运行时异常时立即看到它们。