在 After Effects 表达式(JavaScript 引擎)环境中,调试代码和处理错误是至关重要的。尽管 Ae 表达式编辑器没有内置的 console.log() 调试工具,但可以使用文本图层输出、值监控、拆分表达式以及 try...catch 等方法进行调试。
1、常见的表达式错误类型
(1)语法错误
当表达式语法不正确,如,缺少括号、逗号、拼写错误,Ae 会报错并在表达式编辑框中显示红色警告提示。
示例:缺少括号
var num = 10;num.toString; // ❌ 缺少 (),导致无法正确调用方法
(2)运行时错误
表达式语法正确,但运行时报错,如,访问 undefined 属性、除以 0 以及数组索引越界等。
示例:访问未定义变量
var arr = [10, 20, 30];arr[5]; // ❌ 数组索引越界,返回 undefined
(3)逻辑错误
表达式不会报错,但计算结果不符合预期,这意味着代码可能有逻辑错误。
示例:错误的运算
var width = 1920;var height = 1080;var area = width, height; // ❌ 逗号错误,area 只会赋值为 width
2、Ae 表达式调试方法
由于 Ae 表达式不支持 console.log(),我们需要使用以下方法来进行调试。
(1) 使用文本图层输出调试信息
在文本图层的“源文本”属性中添加表达式,直接显示表达式结果。
// 示例:显示带两位小数的时间值"当前时间: " + time.toFixed(2);
(2)使用 value 进行中间结果测试
value 代表当前属性的默认值,可以用它来逐步测试表达式。
// 示例:为“颜色“属性添加表达式var baseColor = [1, 0, 0, 1]; // 红色var adjustedColor = baseColor.map(c => c * (0.5 + time / 10));value; // 先查看当前值
先测试 value,如果 Ae 未报错,再测试 adjustedColor。
(3)拆分复杂表达式
如果表达式较长或逻辑复杂,可以拆分成多个变量,逐步测试每个部分,以便更容易找出错误。
// 原代码:让一个对象在 X 轴方向进行正弦波运动,最终表达式如下,var amplitude = 50; // 振幅var speed = 2; // 运动速度var x = value[0] + Math.sin(time * speed) * amplitude; // 计算 X 坐标[x, value[1]];
如果动画效果异常,可以逐步拆分调试。
//拆分后的代码var amplitude = 50;var speed = 2;var t = time * speed; // 计算时间变量var sinValue = Math.sin(t); // 计算正弦值var x = value[0] + sinValue * amplitude; // 计算 X 坐标[x, value[1]];
3、使用 try...catch 处理错误
在 Ae 表达式(JavaScript 引擎)中,try...catch 可以用于捕获表达式中可能出现的错误,并防止这些错误导致整个动画的中断。
(1)语法说明
try { // 尝试执行的代码块} catch (error) { // 如果在 try 代码块中出现错误,执行的代码块}
try 语句块:包含你认为可能会发生错误的代码。
catch 语句块:当 try 中的代码抛出错误时,catch 会捕获到这个错误,并可以执行处理错误的代码。
error:也可以是其他自定义的名字,表示 JavaScript 内置的错误对象,它包含了关于错误的信息,如错误类型、错误消息等。可以使用 error.message、error.name 等属性来获取错误详情并进行处理。
(2)throw new Error()
可以使用 throw new Error("错误信息") 主动抛出错误,用于提前终止表达式并提供错误信息。
(3)应用举例
示例 1:捕获除以 0 错误
try { var num = 10; var divisor = 0; var result = num / divisor; // 可能导致错误} catch (error) { result = "错误:" + error.message; // 捕获错误信息}
result;
在 JavaScript 中,10 / 0 不会抛出错误,而是返回 Infinity,所以 catch 代码块不会执行。
如果想要在 10 / 0 的情况下主动触发 catch,可以通过 throw new Error() 来抛出错误。
try { var num = 10; var divisor = 0; if (divisor === 0) throw new Error("除数不能为零"); // 主动抛出错误 var result = num / divisor;} catch (error) { result = "错误:" + error.message;}
result; // 返回 "错误:除数不能为零"
示例 2:处理 undefined 变量
try { var obj; var value = obj.name; // ❌ obj 未定义,可能报错} catch (error) { value = "变量未定义:" + error.message;}
value;
访问 obj.name 可能会报错,但 catch 捕获错误并返回 "变量未定义:Cannot read property 'name' of undefined"。
示例 2:检查 NaN 并抛出错误
try { var x = Math.sqrt(-1); // 可能返回 NaN(Not-a-Number,即“不是数字”) if (isNaN(x)) throw new Error("计算结果为 NaN"); // isNaN(x)判断一个值是否是 NaN。} catch (error) { x = "错误:" + error.message;}
x;
Math.sqrt(-1) 计算无效,返回 NaN,throw new Error() 主动抛出错误,catch 捕获错误并返回 "错误:计算结果为 NaN"。
“点赞有美意,赞赏是鼓励”