来自 the Encoding.GetString(Byte[])
MSDN documentation我发现它可以抛出 ArgumentException
如果:
The byte array contains invalid Unicode code points.
我可以向该方法抛出什么测试数据来引发这样的异常?
我开始尝试基于 this other question about "invalid unicode characters" 的几个输入,例如:
[Fact]
public void Checkit()
{
// Does not throw an ArgumentException :'(
var result = Encoding.UTF8.GetString(new byte[] { 0x80, 0x81 });
}
和
[Fact]
public void Checkit()
{
// Does not throw an ArgumentException :'(
var result = Encoding.UTF8.GetString(new byte[] { 0xc2, 0xc2 });
}
但 Fact
都没有因 ArgumentException
而失败。
我还找到了a whole bunch of supposedly invalid byte sequences in the dotnet runtime repo tests这不会抛出所说的 ArgumentException(在测试一对夫妇时)。
我要问的触发器是我有使用 GetString(Byte[])
的代码,我想看看它如何处理通过为它编写单元测试来输入错误的输入。但我问的原因真的是好奇(我当然可以稍微重写我的单元测试来解决我眼前的问题)。
我可以在 Encoding.UTF8.GetString(Byte[])
处抛出什么“无效的 Unicode 代码点”以导致 ArgumentException
?
最佳答案
UTF8Encoding
类能够抛出异常,但显然它没有提到您需要一个配置为抛出异常的实例,以及默认实例(Encoding.UTF8
) 不是这样配置的。
稍微修改你的事实......
[Fact]
public void Checkit()
{
// Throws DecoderFallbackException
var result = new UTF8Encoding(false, true).GetString(new byte[] { 0x80, 0x81 });
}
[Fact]
public void Checkit()
{
// Throws DecoderFallbackException
var result = new UTF8Encoding(false, true).GetString(new byte[] { 0xc2, 0xc2 });
}
第一个参数 (encoderShouldEmitUTF8Identifier
) 不会影响这些测试,因为它与逆运算有关。如果您还在查看 GetBytes
的工作原理,请传递 false
以省略前导码或传递 true
以包含它(这就是 编码.UTF8
配置)。
您将获得的异常类型是记录的其他异常类型之一,DecoderFallbackException
,在以下情况下抛出:
A fallback occurred (for more information, see Character Encoding in .NET)
-and-
DecoderFallback is set to DecoderExceptionFallback.
因此,如果您可以更改 DecoderFallback
是什么,您可能能够获得您正在寻找的 ArgumentException
。
显然,正如您自己发现的那样,DecoderFallbackException
是 ArgumentException
的子类,因此您已准备就绪。
关于c# - 强制 Encoding.UTF8.GetString 抛出 ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62762770/