BabylonJS/Babylon.js · error
precision must be a finite number greater than 0.
Error message
precision must be a finite number greater than 0.
What it means
Thrown by the 'screenshot' command when args.precision is supplied but Number(args.precision) is NaN/Infinity or <= 0. Precision controls screenshot output quality and must be a finite positive number (default is 1 when omitted).
Source
Thrown at packages/dev/inspector-v2/src/services/cli/screenshotCommandService.ts:69
const cameraId = parseInt(args.cameraUniqueId, 10);
if (isNaN(cameraId)) {
throw new Error("cameraUniqueId must be a number.");
}
camera = scene.cameras.find((c) => c.uniqueId === cameraId);
if (!camera) {
throw new Error(`No camera found with uniqueId ${cameraId}.`);
}
} else {
camera = scene.frameGraph ? FrameGraphUtils.FindMainCamera(scene.frameGraph) : scene.activeCamera;
}
if (!camera) {
throw new Error("No camera available for screenshot.");
}
const precision = args.precision !== undefined ? Number(args.precision) : 1;
if (!Number.isFinite(precision) || precision <= 0) {
throw new Error("precision must be a finite number greater than 0.");
}
let width: number | undefined;
if (args.width !== undefined) {
width = Number(args.width);
if (!Number.isFinite(width) || width <= 0 || !Number.isInteger(width)) {
throw new Error("width must be a finite positive integer.");
}
}
let height: number | undefined;
if (args.height !== undefined) {
height = Number(args.height);
if (!Number.isFinite(height) || height <= 0 || !Number.isInteger(height)) {
throw new Error("height must be a finite positive integer.");
}
}
const screenshotSize = width !== undefined && height !== undefined ? { width, height, precision } : { precision };
View on GitHub (pinned to 0592b347b8)
Solutions
- Pass precision as a positive finite number, e.g. precision: 1 (default) or 0.5 for half quality.
- Omit precision to use the default value of 1.
- Convert/strip units in scripts before passing (e.g. 90 → 0.9).
Example fix
// before
await execute("screenshot", { precision: "90%" });
// after
await execute("screenshot", { precision: 0.9 }); Defensive patterns
Strategy: validation
Validate before calling
if (args.precision !== undefined) {
const p = Number(args.precision);
if (!Number.isFinite(p) || p <= 0) throw new RangeError(`precision must be a finite number > 0, got: ${args.precision}`);
} Type guard
function isValidPrecision(v: unknown): v is number { return typeof v === "number" && Number.isFinite(v) && v > 0; } Try / catch
try {
await screenshot({ precision });
} catch (e) {
if (e instanceof Error && e.message.startsWith("precision must be")) {
return screenshot({}); // omit to use default precision 1
}
throw e;
} Prevention
- Coerce with Number() and validate Number.isFinite before passing.
- Never pass strings with units ("90%"); pass plain numbers.
- Omit precision when the default (1) is acceptable.
When it happens
Trigger: Calling screenshot with precision="abc", 0, -2, Infinity, or any value that fails Number.isFinite(precision) && precision > 0.
Common situations: Passing percentage strings like "90%" (Number gives NaN); passing 0 expecting 'auto'; unit confusion (passing 100 expecting percent where a multiplier is expected).
Related errors
- width must be a finite positive integer.
- uniqueId must be a number.
- No active scene.
- cameraUniqueId must be a number.
- No camera available for screenshot.
AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30).
Data as JSON: /api/errors/21f68e5eb907036f.
Report an issue: GitHub.